summaryrefslogtreecommitdiff
path: root/perl/p2.pl
diff options
context:
space:
mode:
Diffstat (limited to 'perl/p2.pl')
-rw-r--r--perl/p2.pl41
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"