#!/usr/bin/perl use v5.14; use strict; use warnings; my $result = 0; my $level = 2; # next is F2 my $max_val = 4_000_000; my $max_rec = 1000; my $DBG = 1; fib(1,0); # F1,F0 print $result; sub fib { my @frame = @_; #my $DBG = 1; unshift @frame, $frame[0] + $frame[1]; # prepend next level Fib (see footnote 1) pop @frame; # remove tailing Fib (optional) count($frame[0]); say "Fib(" . $level++ . ") = $frame[0]" if $DBG; say " ... # \@frame = (@frame)" if $DBG; # playing safe with deep recursion die "May recursion $max_rec exceeded" if $level > $max_rec; return fib(@frame) unless($frame[0] >= $max_val); } sub count { my ($increment) = @_; #my $DBG = 1; if(($increment % 2) == 0){ say "adding Fib($level) = $increment to $result" if $DBG; $result += $increment; } } #### Compilation started at Tue Jul 29 22:14:14 perl /home/lanx/perl/pm/euler_problem_2.pl Fib(2) = 1 ... # @frame = (1 1) adding Fib(3) = 2 to 0 Fib(3) = 2 ... # @frame = (2 1) Fib(4) = 3 ... # @frame = (3 2) Fib(5) = 5 ... # @frame = (5 3) adding Fib(6) = 8 to 2 Fib(6) = 8 ... # @frame = (8 5) Fib(7) = 13 ... # @frame = (13 8) Fib(8) = 21 ... # @frame = (21 13) adding Fib(9) = 34 to 10 Fib(9) = 34 ... # @frame = (34 21) Fib(10) = 55 ... # @frame = (55 34) Fib(11) = 89 ... # @frame = (89 55) adding Fib(12) = 144 to 44 Fib(12) = 144 ... # @frame = (144 89) Fib(13) = 233 ... # @frame = (233 144) Fib(14) = 377 ... # @frame = (377 233) adding Fib(15) = 610 to 188 Fib(15) = 610 ... # @frame = (610 377) Fib(16) = 987 ... # @frame = (987 610) Fib(17) = 1597 ... # @frame = (1597 987) adding Fib(18) = 2584 to 798 Fib(18) = 2584 ... # @frame = (2584 1597) Fib(19) = 4181 ... # @frame = (4181 2584) Fib(20) = 6765 ... # @frame = (6765 4181) adding Fib(21) = 10946 to 3382 Fib(21) = 10946 ... # @frame = (10946 6765) Fib(22) = 17711 ... # @frame = (17711 10946) Fib(23) = 28657 ... # @frame = (28657 17711) adding Fib(24) = 46368 to 14328 Fib(24) = 46368 ... # @frame = (46368 28657) Fib(25) = 75025 ... # @frame = (75025 46368) Fib(26) = 121393 ... # @frame = (121393 75025) adding Fib(27) = 196418 to 60696 Fib(27) = 196418 ... # @frame = (196418 121393) Fib(28) = 317811 ... # @frame = (317811 196418) Fib(29) = 514229 ... # @frame = (514229 317811) adding Fib(30) = 832040 to 257114 Fib(30) = 832040 ... # @frame = (832040 514229) Fib(31) = 1346269 ... # @frame = (1346269 832040) Fib(32) = 2178309 ... # @frame = (2178309 1346269) adding Fib(33) = 3524578 to 1089154 Fib(33) = 3524578 ... # @frame = (3524578 2178309) Fib(34) = 5702887 ... # @frame = (5702887 3524578) 4613732 Compilation finished at Tue Jul 29 22:14:14