sub A { BARE_BLOCK: { if (0 == $_[0]) { return 1 + $_[1]; } elsif (1 == $_[0]) { return 2 + $_[1]; } elsif (2 == $_[0]) { return 3 + 2*$_[1]; } @_=($_[0] - 1, $_[1] ? A($_[0], $_[1]-1) : 1); redo BARE_BLOCK; } }