我一直在研究在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);
答案 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知识无法翻译,对不起!任何编辑此答案以编辑代码的人都会感激不尽。
更多测试问题是列出生成汉明数字惰性列表的方法。