On Thu, Dec 12, 2013 at 02:05:35PM +1100, Jacinta Richardson wrote:
: sub MAIN($terms = 35, $maximum = 4_000_000) {
: my @sequence = gather for fibonacci($maximum) -> $number {
: state $count = 0;
: take $number if $number < $maximum && $count++ < $terms;
: };
:
: say @sequence;
: }
:
: sub fibonacci($maximum) {
: my @numbers := 0, 1, *+* ... * < $maximum;
: return @numbers;
: }
Your main problem here is that your series is terminated backwards.
The ... runs until the right side matches, and and 0 < $maximum,
so it terminates on 0. So you want * > $maximum. You can also use a ^
to exclude the last value whwere it becomes true, so you can just say
0, 1, *+* ...^ * > $maximum
and then you don't have to put in the extra check in your loop.
But you don't really need the loop either. A more succinct way to
pick the first N terms is to use slice subscripting to pick out the 0th
to the $term'th - 1 element (again, using ^ to exclude the final value):
say (0, 1, *+* ...^ * > $maximum)[0 ..^ $terms];
We also often like to abbreviate 0 ..^ $terms down to ^$terms like this
say (0, 1, *+* ...^ * > $maximum)[^$terms];
But usually we just limit it by number of terms, and don't care about the
maximum:
say (0, 1, *+* ... *)[^$terms];
Hope this helps...
Larry