Eri*_*rom 21 perl fibonacci lazy-evaluation perl6 raku
我一直在研究在Perl 6中构造惰性列表的各种方法,我想收集描述Fibonacci序列的所有简洁方法.
我将从马萨克的期刊中的三个开始:
my @fibs := (0, 1, -> $a, $b { $a + $b } ... *);
my @fibs := (0, 1, { $^a + $^b } ... *);
my @fibs := (0, 1, *+* ... *);
Run Code Online (Sandbox Code Playgroud)
我认为这样的东西也会起作用,但我认为我的语法有误:
my @fibs := (0, 1, (@fibs Z+ @fibs[1..*]));
Run Code Online (Sandbox Code Playgroud)
有什么东西急切(切片?)并导致Rakudo进入无限循环.它是Haskell定义的翻译:
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
Run Code Online (Sandbox Code Playgroud)
更新:
看起来像zipWith示例的问题是@fibs[1..*]切片.if tail定义为sub tail (@x) {my $i = 1; {@x[$i++]}...*}然后它正常工作.我很想知道为什么切片对任何熟悉Rakudo内部的人来说都不是懒惰的.
另一个不错的是:
my @fibs := (0, [\+] 1, @fibs);
Run Code Online (Sandbox Code Playgroud)
您可以使用黄金比例的魔力:设 φ=(sqrt(5)+1)/2,并定义fib(n) =(φ n +(1-φ) n )/sqrt(5)。
您可以通过明显的方式将这样的函数转换为惰性列表:在 Haskell 中,可以执行以下操作:
fibs=genfibs 0 其中 genfibs n=(round (fib n)):genfibs (n+1)
恐怕我的 Perl 6 知识不足以翻译这个,抱歉!任何编辑此答案并在代码中进行编辑的人都将赢得我的感激。
一个更具测试性的问题是列出生成汉明数惰性列表的方法。