Сколько существует способов описать последовательность Фибоначчи в Perl 6? - PullRequest
21 голосов
/ 20 октября 2010

Я рассматривал различные способы создания отложенных списков в 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..*]));

Что-то там есть (ломтик?) И заставляет Ракудо войти в бесконечный цикл. Это перевод определения Haskell:

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

Обновление:

Похоже, проблема с примером zipWith - это срез @fibs[1..*]. если tail определен как sub tail (@x) {my $i = 1; {@x[$i++]}...*}, то он работает правильно. Мне было бы интересно узнать, почему ломтик не ленится от тех, кто знаком с внутренностями Ракудо.

Еще один приятный:

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

Ответы [ 2 ]

4 голосов
/ 08 декабря 2010

Самый короткий, кажется,

my @fibs := ^2,*+*...*;
0 голосов
/ 22 октября 2010

Вы можете использовать магию золотого сечения: пусть φ = (sqrt (5) +1) / 2 и определит fib (n) = (φ n +(1-φ) n ) / sqrt (5).

Вы можете преобразовать такую ​​функцию в ленивый список очевидным образом: В Haskell работают следующие функции:

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

Боюсь, мои знания Perl 6 не предназначены для перевода этого, извините!Любой, кто отредактирует этот ответ для редактирования в кодах, заслужит мою благодарность.

Еще один вопрос для тестирования - перечислить способы составления ленивого списка чисел Хэмминга.

...