algorithm - Perl 在计算阶乘 N 的递归实现中在哪里保存中间结果?

标签 algorithm perl recursion factorial

在 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/

相关文章:

algorithm - 如何在 2D 中绘制透视校正网格

Swift 我的函数如何超过 O(n)?

c# - 再次在数据库中查找自由格式文本

javascript - 递归函数数组到字符串javascript

python - 尝试使用 python 计算斐波那契数的最后一位时出现错误 "RuntimeWarning: overflow encountered in long_scalars"

regex - 格式化 perl 正则表达式捕获组

perl - 将 Perl 转换为 Java 的原因是什么?

perl - 需要解析这个 dumpsys 输出(最好使用 Perl)

javascript - find() 的递归版本

c++ - main 的递归