请在以下代码中解释recursion语句的工作原理.
int factR(int n) {
int result;
if(n==1) return 1;
result = factR(n-1) * n;
return result;
}
Run Code Online (Sandbox Code Playgroud)
我的理解是:
在上面的语句中,该factR(n-1)方法调用自身直到结束.假设我们想得到6的阶乘,它将作为参数发送给这个方法.它将作为参数接收n,n然后将检查其值; 如果是1那么将返回1.但是如果它不是1,就像我们的情况那样它是6,则递归语句将运行.
现在我遇到的问题是第一次n-1变为5并且乘以n,其保持值6,然后它变为30.现在30将GO在哪里?
然后该方法将调用自身,此时间n-1变为4,然后它乘以nIF保持值"6"然后4*6 = 24,我认为这是错误的.因为如果我们经历这种方式,那么在下一次调用中,进程将是类似的,n-1将变为3*n,其中IF保持相同的值,即6然后它将变为3*6 = 18.然后下一次调用发生并且n-1变为2我们乘以并假设它n保持值6然后2*6 = 12,并且最后调用n-1= 1*n = 6.我的观点是很明显n-1会减小值,n-1即6-1 = 5然后5-1 = 4然后4-1 = 3然后3-1 = 2和2-1 = 1.但问题是,n每当方法调用自身时,它的值是多少?
如果你说当第一次乘法发生时,即"n-1"变为5然后乘以6 = 30而30则存储在"n"然后在下一次调用中5-1 = 4*30 = 120,然后4- 1 = 3*120 = 360,然后3-1 = 2*360 = 720,最后1*720 = 720那么Java如何确定将结果值放回变量n?
如果我在result每次方法以这种方式调用自身时放置另一个语句来检查变量的值是什么,如下所示:
int factR(int n) {
int result;
if(n==1) return 1;
result = factR(n-1)*n ;
System.out.println(result);
return result;
}
Run Code Online (Sandbox Code Playgroud)
然后我得到这个输出:
2
6
24
120
720
Factorial of 6 is 720
Run Code Online (Sandbox Code Playgroud)
我不明白它在第一次通话中是如何产生2的.值2和然后6,24,120和720来自哪里?我认为我严重陷入了代码的工作中.
该函数将扩展,直到达到终止语句(n == 1).那么假设n = 6,那么我们有factR(n-1) * n = factR(5) * 6,但是什么factR(5)呢?嗯,这只是factR(4) * 5,所以我们看到了factR(5) * 6 = (factR(4) * 5) * 6.现在请注意factR(1) = 1,我们得到了
factR(6) = factR(5) * 6
= (factR(4) * 5) * 6
= ((factR(3) * 4) * 5) * 6
= (((factR(2) * 3) * 4) * 5) * 6
= ((((factR(1) * 2) * 3) * 4) * 5) * 6
= ((((1 * 2) * 3) * 4) * 5) * 6
= (((2 * 3) * 4) * 5) * 6
= ((6 * 4) * 5) * 6
= (24 * 5) * 6
= 120 * 6
= 720
Run Code Online (Sandbox Code Playgroud)
m_c*_*ens -1
该方法实际上应该像这样构建来查找 的阶乘n:
int factorial(int n)
{
if (n == 1)
return 1;
return n * factorial(n - 1);
}
Run Code Online (Sandbox Code Playgroud)
在我看来,在递归函数内实例化新变量并不是一个好主意,因为由于作用域的原因,它们只会在每次调用时被重置。
| 归档时间: |
|
| 查看次数: |
315 次 |
| 最近记录: |