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

时间:2010-10-20 17:57:29

标签: perl lazy-evaluation fibonacci perl6 raku

我一直在研究在Perl 6中构造惰性列表的各种方法,我想收集所有描述Fibonacci序列的简洁方法。

我将从masak的日记中开始讨论:

my @fibs := (0, 1, -> $a, $b { $a + $b } ... *);

my @fibs := (0, 1, { $^a + $^b } ... *);  

my @fibs := (0, 1, *+* ... *);

我认为这样的事情也会奏效,但我认为我的语法有误:

my @fibs := (0, 1, (@fibs Z+ @fibs[1..*]));

有什么东西急切(切片?)并导致Rakudo进入无限循环。它是Haskell定义的翻译:

fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

更新

似乎zipWith示例的问题是@fibs[1..*]切片。如果tail定义为sub tail (@x) {my $i = 1; {@x[$i++]}...*},那么它可以正常运行。我很想知道为什么切片对任何熟悉Rakudo内部人员的人都不是很懒惰。

另一个不错的是:

my @fibs := (0, [\+] 1, @fibs);

2 个答案:

答案 0 :(得分:4)

最短的似乎是

my @fibs := ^2,*+*...*;

答案 1 :(得分:0)

你可以使用黄金比例的魔力:让φ=(sqrt(5)+1)/ 2,并定义 fib(n) =(φ n +(1-φ)名词)/ SQRT(5)。

您可以用显而易见的方式将这样的函数转换为惰性列表:在Haskell中,以下工作:

fibs=genfibs 0 where genfibs n=(round (fib n)):genfibs (n+1)

我担心我的Perl 6知识无法翻译,对不起!任何编辑此答案以编辑代码的人都会感激不尽。

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