22

我一直在研究在 Perl 6 中构建惰性列表的各种方法,我想收集所有描述斐波那契数列的简明方法。

我将从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..*]切片。iftail定义为sub tail (@x) {my $i = 1; {@x[$i++]}...*}then 它可以正常工作。我很想知道熟悉 Rakudo 内部结构的人为什么不偷懒。

另一个不错的是:

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

2 回答 2

4

最短的似乎是

my @fibs := ^2,*+*...*;
于 2010-12-08T16:28:32.247 回答
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 知识不足以翻译这个,抱歉!任何编辑此答案以在代码中进行编辑的人都会得到我的感激。

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

于 2010-10-22T10:07:09.617 回答