use List::MoreUtils qw(all); sub series { _series(2, @_); } sub _series { my $recursion_level = shift; return if $recursion_level < 0; return if @_ < 2; my $first = $_[0]; if (all { $_ == $first } @_) { return $first; } my @a = map { $_[$_+1] - $_[$_] } 0 .. (@_ - 2); my $r = _series($recursion_level - 1, @a); return $_[-1] + $r if defined $r; # catch division by zero $r = eval { @a = map { $_[$_+1] / $_[$_] } 0 ... (@_ - 2); _series($recursion_level - 1, @a); }; return $_[-1] * $r if defined $r; return; }