Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How many ways are there to describe the Fibonacci sequence in Perl 6?

Tags:

I've been looking at the various ways of constructing lazy lists in Perl 6 and I would like to collect all of the concise ways of describing the Fibonacci sequence.

I will start this off with the three from masak's journal:

my @fibs := (0, 1, -> $a, $b { $a + $b } ... *);  my @fibs := (0, 1, { $^a + $^b } ... *);    my @fibs := (0, 1, *+* ... *); 

I was thinking something like this would also work, but I think I have the syntax wrong:

my @fibs := (0, 1, (@fibs Z+ @fibs[1..*])); 

Something there is eager (the slice?) and causes Rakudo to enter an infinite loop. It's a translation of the Haskell definition:

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

Update:

Seems like the problem with the zipWith example is the @fibs[1..*] slice. if tail is defined as sub tail (@x) {my $i = 1; {@x[$i++]}...*} then it works properly. I would be interested to know why the slice isn't lazy from anyone familiar with Rakudo's internals.

Another nice one is:

my @fibs := (0, [\+] 1, @fibs); 
like image 845
Eric Strom Avatar asked Oct 20 '10 17:10

Eric Strom


1 Answers

The shortest seems to be

my @fibs := ^2,*+*...*; 
like image 62
Pat Avatar answered Oct 21 '22 16:10

Pat