有多少种方法可以描述Perl 6中的Fibonacci序列?

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)

Cha*_*art 0

您可以使用黄金比例的魔力:设 φ=(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 知识不足以翻译这个,抱歉!任何编辑此答案并在代码中进行编辑的人都将赢得我的感激。

一个更具测试性的问题是列出生成汉明数惰性列表的方法。

  • 在 Perl 6 中将此类函数转换为惰性列表的一种方法是“my @fibs = ->{ fib $++ } ... *”。我不认为你所拥有的可以轻松地直接转换为 Perl 6,因为函数通常不是惰性的。`$ perl6 -e '常数 φ = (sqrt(5)+1)/2; sub fib (\n) { (φ**n - (1-φ)**n)/sqrt(5) }; 我的 @fibs = ->{ round fib $++ } ... *; 说@fibs'`,尽管由于浮点错误,在前 70 个结果之后开始得到不正确的结果。(我用 FatRats 得到了更正确的数字,但这大大减慢了计算速度) (2认同)