在 Perl 上有一个计算阶乘 N 的递归实现。
sub fact {
my ($n) = shift;
return $n if $n <= 2;
return $n * fact($n - 1);
}
有人能给我解释一下 Perl 在函数给出结果之前在哪里保存中间结果吗?
UPD 以及如何使用调试器或其他工具查看它们?
从回答中我被解释说这个值保存在一个堆栈中,但是我如何从堆栈中看到这些值?
最佳答案
$n
返回的标量存储在堆栈中。
这是调用 fact
之前堆栈的样子:
$n
在递归级别 0 中返回的标量- 名单:
$n
在递归级别 1 中返回的标量- 名单:
$n
在递归级别 2 中返回的标量- 名单:
$n-1
在递归级别 2 中返回的标量\&fact
在递归级别 2 中返回的标量
这是调用 fact
后堆栈的样子:
$n
在递归级别 0 中返回的标量- 名单:
$n
在递归级别 1 中返回的标量- 名单:
$n
在递归级别 2 中返回的标量fact($n - 1)
在递归级别 2 中返回的标量
此时,乘法运算符会将堆栈中的最后两个值相乘,并将结果放入堆栈。
$n
在递归级别 0 中返回的标量- 名单:
$n
在递归级别 1 中返回的标量- 名单:
$n * fact($n - 1)
在递归级别 2 中返回的标量
然后子返回,
$n
在递归级别 0 中返回的标量- 名单:
$n
在递归级别 1 中返回的标量fact($n - 1)
在递归级别 1 中返回的标量
等等。
关于algorithm - Perl 在计算阶乘 N 的递归实现中在哪里保存中间结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14107049/