#!/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"