summaryrefslogtreecommitdiff
path: root/perl/p2.pl
blob: 06c173a077f620bfd00effa2c4efd9ea4c77180e (plain) (blame)
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"