diff options
Diffstat (limited to 'perl/p2.pl')
-rw-r--r-- | perl/p2.pl | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/perl/p2.pl b/perl/p2.pl new file mode 100644 index 0000000..ec85ec1 --- /dev/null +++ b/perl/p2.pl @@ -0,0 +1,41 @@ +#!/usr/bin/env perl + +use strict; +use warnings; + +# Functional (naïve) +sub iter1 { + my ($fibs, $acc) = @_; + my ($a, $b) = @$fibs; + if ($a > 4_000_000) { + return $acc; + } else { + iter1([$b, $a+$b], $a & 1 ? $acc : $acc + $a); + } +} +print iter1([1, 2], 0); +print "\n"; + +# Functional (tail recursive) +sub iter2 { + my ($fibs, $acc) = @_; + my ($a, $b) = @$fibs; + if ($a > 4_000_000) { + return $acc; + } else { + @_ = ([$b, $a+$b], $a & 1 ? $acc : $acc + $a); + goto &iter2; + } +} +print iter2([1, 2], 0); +print "\n"; + +# Imperative +my ($a, $b) = (1, 2); +my $resp = 0; +do { + $resp += $a unless ($a & 1); + ($a, $b) = ($b, $a+$b); +} while ($a <= 4_000_000); + +print "$resp\n" |