##
sub fact {
my ($n, $prod) = @_;
$prod ||= 1;
return $prod if $n == 0;
return _fact($n-1, $n*$prod);
}
fact($n);
##
##
sub fact {
my ($n) = @_;
my $prod = 1;
$prod *= $n-- while $n > 0;
return $prod;
}
fact($n);