1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
#!/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), "\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), "\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"
|