Algorithm Perl在计算阶乘N的递归实现中保留中间结果的位置?
在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; 更新:我看你也对退
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为您带来了神奇的效果。如果您试图解决一个具体问题,说明您正在尝试做什么,而不是如何做,可能会有所帮助。(如果这是一个学术问题,我仍然不太明白。)