sub series(@items, $recursion_level = 2) { return if $recursion_level < 0; return if @items < 2; # are all items the same? return @items[0] if [==] @items; # detect arithmetic sequences my @diffs = map { @items[$_+1] - @items[$_] }, 0 .. (@items - 2); my $d = series(@diffs, $recursion_level - 1); return @items[*-1] + $d if $d.defined; # detect geometric sequences my $r = try { my @ratios = map { @items[$_+1] / @items[$_] }, 0 .. (@items - 2); series(@ratios, $recursion_level - 1); } return @items[*-1] * $r if $r.defined; # give up return; }