int factR(int n) {
int result;
if(n==1) return 1;
result = factR(n-1) * n;
return result;
}
我的理解是:
在上述语句中,factR(n-1)
方法会一直调用自身,直到结束。假设我们想要得到6的阶乘,它将作为参数发送到此方法中。它将作为参数n
接收,然后检查n
的值;如果它为1,则返回1。但如果它不是1,例如我们的情况下是6,则递归语句将运行。
现在我面临的问题是,第一次n-1
变成5并与n相乘,n保持值6,那么它变成30。那么这个30会去哪里呢?
然后该方法将调用自身,这次n-1
变成4,然后乘以n
,如果n
保持值"6",则4*6=24,我认为这是错误的。因为如果我们按照这种方式进行,那么在下一次调用中,过程将类似于,n-1
将变为3*n,如果它保持相同的值即6,则它将变为3*6=18。然后发生下一个调用,n-1
变为2,如果我们乘以n
并假设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,那么在下一次调用中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;
}
然后我得到了这个输出:
2
6
24
120
720
Factorial of 6 is 720
我不明白它在第一次调用时如何产生2。这些值2、6、24、120和720从哪里来的?我认为我对代码的工作原理非常困惑。
30
。它将从1*2
开始 -> 将结果传递给调用者方法*3
-> 将结果传递给调用者方法*4
等等。每次递归调用都会被放入堆栈中,当它到达不再进行任何递归的点时,堆栈会从顶部(最后一次调用)返回到底部(第一次调用)。 - SomeJavaGuy