【发布时间】:2016-02-20 08:12:18
【问题描述】:
请在下面的代码中解释递归语句的工作原理。
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,保持值为 6,然后变为 30。现在 30 会去哪里?
然后该方法将调用自身,这一次n-1 变为 4,然后乘以 n,其中 IF 持有值“6”,然后 4*6=24 我认为这是错误的。因为如果我们通过这种方式,那么在下一次通话中
该过程将类似于,n-1 将变为 3*n,其中 IF 保持相同的值,即 6,然后它将变为 3*6= 18。然后发生下一次调用,如果我们相乘并假设 n-1 变为 2 987654330@ 保留值 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;
}
然后我得到这个输出:
2
6
24
120
720
Factorial of 6 is 720
我不明白它是如何在第一次调用中产生 2 的。值 2 和 6、24、120 和 720 是从哪里来的?我认为我严重卡在代码的工作中。
【问题讨论】:
-
你试过调试代码了吗?
-
你走错路了。在你的情况下,它不会首先得到
30。它将以1*2开头-> 将结果传递给调用者方法*3-> 将结果传递给调用者方法*4等等。递归调用的每个调用都被放入堆栈,当它到达不再进行任何进一步递归的点时,它会从顶部(最后一次调用)一直回到底部(第一次调用)。 -
2 不是第一次调用,是第二次调用,只是你的第一次调用在 println 之前返回
-
因为:1) 你有 if(n==1) return 1;在您的 Syste.out.println 之前,这意味着不打印第一次调用 2)您的 System.out.println 是在递归调用之后,这意味着将首先调用递归,然后输出 ==> 输出将是“从头到尾”。 Soooo:跳过第一个调用(1),第二个是 1+2=2,第三个是 1*2*3 = 6 等等
-
if(n==1) return 1;是一个错误 条件:factR(0)挂起系统。应该是if(n <= 1) return 1;