Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm Perl在计算阶乘N的递归实现中保留中间结果的位置?_Algorithm_Perl_Recursion_Factorial - Fatal编程技术网

Algorithm Perl在计算阶乘N的递归实现中保留中间结果的位置?

Algorithm Perl在计算阶乘N的递归实现中保留中间结果的位置?,algorithm,perl,recursion,factorial,Algorithm,Perl,Recursion,Factorial,在Perl上有计算阶乘N的递归实现 sub fact { my ($n) = shift; return $n if $n <= 2; return $n * fact($n - 1); } 子事实{ 我的($n)=班次; 如果任何调用的$n中间结果都保存在堆栈上,则返回$n,就像函数中的局部变量一样 return $n * fact($n - 1); 处理相当于: my $temp = fact($n - 1); return $n * $temp; 更新:我看你也对退

在Perl上有计算阶乘N的递归实现

sub fact {
  my ($n) = shift;
  return $n if $n <= 2;
  return $n * fact($n - 1);
}
子事实{
我的($n)=班次;

如果任何调用的$n中间结果都保存在堆栈上,则返回$n,就像函数中的局部变量一样

return $n * fact($n - 1);
处理相当于:

my $temp = fact($n - 1);
return $n * $temp;
更新:我看你也对退货前产品的存放位置感兴趣。这也是一种临时存放方式,因此相当于:

my $temp1 = fact($n - 1);
my $temp2 = $n * $temp1;
return $temp2;

任何调用的中间结果都保存在堆栈上,就像函数中的局部变量一样

return $n * fact($n - 1);
处理相当于:

my $temp = fact($n - 1);
return $n * $temp;
更新:我看你也对退货前产品的存放位置感兴趣。这也是一种临时存放方式,因此相当于:

my $temp1 = fact($n - 1);
my $temp2 = $n * $temp1;
return $temp2;

由于
$n
被声明为
my$n
,它是一个词汇范围的变量,存储在堆栈中,而不是系统表中。有关详细信息,请参阅。

由于
$n
被声明为
my$n
,它是一个词汇范围的变量,存储在堆栈中,而不是系统表中。有关更多信息,请参阅操作。

$n
返回的标量存储在堆栈上

这就是堆栈在调用
fact
之前的样子:

  • 递归级别为0的
    $n
    返回的标量
  • 名单:
    • 递归级别1中的
      $n
      返回的标量
    • 名单:
      • 递归级别2中的
        $n
        返回的标量
      • 名单:
        • 递归级别2中的
          $n-1
          返回的标量
        • 递归级别2中由
          \&fact
          返回的标量
这就是调用
fact
后堆栈的外观:

  • 递归级别为0的
    $n
    返回的标量
  • 名单:
    • 递归级别1中的
      $n
      返回的标量
    • 名单:
      • 递归级别2中的
        $n
        返回的标量
      • 递归级别2中由
        fact($n-1)
        返回的标量
此时,乘法运算符将把堆栈上的最后两个值相乘,并将结果放在堆栈上

  • 递归级别为0的
    $n
    返回的标量
  • 名单:
    • 递归级别1中的
      $n
      返回的标量
    • 名单:
      • 递归级别2中由
        $n*fact($n-1)
        返回的标量
然后潜艇返回

  • 递归级别为0的
    $n
    返回的标量
  • 名单:
    • 递归级别1中的
      $n
      返回的标量
    • 递归级别1中的
      fact($n-1)
      返回的标量

以此类推。

$n
返回的标量存储在堆栈上

这就是堆栈在调用
fact
之前的样子:

  • 递归级别为0的
    $n
    返回的标量
  • 名单:
    • 递归级别1中的
      $n
      返回的标量
    • 名单:
      • 递归级别2中的
        $n
        返回的标量
      • 名单:
        • 递归级别2中的
          $n-1
          返回的标量
        • 递归级别2中由
          \&fact
          返回的标量
这就是调用
fact
后堆栈的外观:

  • 递归级别为0的
    $n
    返回的标量
  • 名单:
    • 递归级别1中的
      $n
      返回的标量
    • 名单:
      • 递归级别2中的
        $n
        返回的标量
      • 递归级别2中由
        fact($n-1)
        返回的标量
此时,乘法运算符将把堆栈上的最后两个值相乘,并将结果放在堆栈上

  • 递归级别为0的
    $n
    返回的标量
  • 名单:
    • 递归级别1中的
      $n
      返回的标量
    • 名单:
      • 递归级别2中由
        $n*fact($n-1)
        返回的标量
然后潜艇返回

  • 递归级别为0的
    $n
    返回的标量
  • 名单:
    • 递归级别1中的
      $n
      返回的标量
    • 递归级别1中的
      fact($n-1)
      返回的标量

依此类推。

通过递归,每次调用中传递的任何参数都会进入调用帧/堆栈。通过使用Carp&cluck,您可以看到调用帧。中间结果是在堆栈到达基址($v==1)时展开的。它是否仅在CPU寄存器中?和运算符(*)将此中间结果与堆栈上的$v相乘。也可签出

在调试模式下运行也会有所帮助

perl-d factorial.pl


通过递归,每次调用中传递的任何参数都会进入调用帧/堆栈。通过使用Carp&cluck,您可以看到调用帧。当堆栈到达基本情况($v==1)时,会计算中间结果。它是否仅在CPU寄存器中?和运算符(*)将此中间结果与堆栈上的$v相乘。也可签出

在调试模式下运行也会有所帮助

perl-d factorial.pl


如中所示,在堆栈中递归调用
事实
,或
$n
,或…?的结果。@minitech您知道如何从堆栈中访问这些中间结果吗?“堆栈”在Perl中不是显式的。您只需使用该变量即可访问
$n
。调用函数的计算结果就是返回值。Perl为您带来了神奇的效果。如果您试图解决一个具体问题,说明您正在尝试做什么,而不是如何做,可能会有所帮助。(如果这是一个学术问题,我仍然不太明白。)