summaryrefslogtreecommitdiff
path: root/perl/p2.pl
blob: ec85ec1a6c9b558e2b4d5effde796a19442d892b (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
40
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"