sub factorial { my ($n) = @_; if ($n == 0) { return 1; } return $n * factorial($n - 1); } #### sub factorial { my ($n, $accumulator) = @_; $accumulator ||= 1; if ($n == 0) { return $accumulator; } return factorial($n - 1, $n * $accumulator); } #### call factorial ... call factorial ... call factorial ... call factorial ... return return return return #### call factorial ... change args and reloop ... change args and reloop ... change args and reloop ... return #### sub factorial { my ($n, $accumulator) = @_; $accumulator ||= 1; LOOP: if ($n == 0) { return $accumulator; } $accumulator *= $n; $n--; goto LOOP; }