Подтвердить что ты не робот

Сколько способов описать последовательность Фибоначчи в Perl 6?

Я рассматривал различные способы построения ленивых списков в 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 вводить бесконечный цикл. Это перевод определения Хаскелла:

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

Update:

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

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

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

Ответ 1

Самый короткий результат -

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

Ответ 2

Вы можете использовать магию золотого отношения: let & phi; = (sqrt (5) +1)/2 и определить fib (n) = (& phi; n + (1- & Phi;.) п)/SQRT (5)

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

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

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

Более сложный вопрос будет состоять в том, чтобы перечислить способы генерации ленивого списка чисел Хэмминга.