22

私はPerl6でレイジーリストを作成するさまざまな方法を見てきましたが、フィボナッチ数列を記述する簡潔な方法をすべて集めたいと思います。

私はこれをmasakのジャーナルからの3つから始めます:

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の内部に精通している人からスライスが怠惰ではない理由を知りたいと思います。

もう1つの素晴らしいものは次のとおりです。

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 に答える