我已经理解了使用for循环的答案,但是我最近遇到了这段代码,我不知道它是如何工作的。
public class learn {
public static int factorial (int N){
if (N<=1 ) return 1; // won't this mean that "1" is returned at the end all the time?
else return (N*factorial (N-1)); /* since there's no variable storing the sum
I don't get how this is working out either,
won't it just be returned and lost?*/
}
public static void main(String[] args) {
System.out.println(factorial(4));
}
}
来自python背景,所以也许我对java中的收益有误解... [编辑] 似乎return 1
也是用Python编写的,因此可能不是语言问题,我只是不了解递归函数 end 的方式(我了解过程的进行方式-它是一个自我调用的函数)。
这是我(错误地)解释此代码的说明:
factorial(4)
被称为else
语句将运行-4*factorial(3)
factorial(3)
被称为-else
语句再次运行-3*factorial(2)
factorial(2)
被称为-2*factorial(1)
。此时,我们有4 * 3 * 2 * 1,但是代码仅在if (N<=1) return 1
行停止的事实意味着返回1而不是总和吗? (我显然错了,因为控制台打印了正确的数字-24
)答案 0 :(得分:3)
这是否意味着始终在末尾返回“ 1”?
否,只有N
小于1时,它才会返回1(根据您的条件if (N<=1 ) return 1;
)
对于所有其他情况,它会递归地继续。
因为没有变量存储总和 我也不明白这是怎么解决的, 会不会只是退回而丢失?
方法返回时,它将退出当前方法,并返回到调用点,并从此处继续。为简单起见,请采用以下方案:methodA调用methodB,methodB调用methodC:
public void methodA(){
print("entering method A.."); //(1)methodA invoked..
methodB(); //(2)call methodB
print("exiting method A"); //(8)exit from methodB, continue from here
}
public void methodB(){
print("entering method B.."); //(3)mthodB invoked..
methodC(); //(4)call methodC
print("exiting method B"); //(7)exit from methodC, continue from here. exit methodB
}
public void methodC(){
print("entering method C.."); //(5)methodC invoked..
print("exiting method C"); //(6)exit methodC, continue from whoever called methodC
}
您将获得如下结果:
entering method A..
entering method B..
entering method C..
exiting method C
exiting method B
exiting method A
如果您可以理解方法A B和C的程序流程。现在尝试了解一种称为“自身”的方法。
//Let say N is 3..
public static void main(String[] args){
factorial(3); //(9)
}
public static int factorial (int N) //(1)N:3, (3)N:2, (5)N:1
{
if (N<=1 )
return 1; //(6)Ret 1, return and continue from whoever called me
else
return (N*factorial (N-1)); //(2), (4), (7)Ret 2*1, (8)Ret 3*2*1
}
在(6)处,它通过返回1退出该方法,并从调用此方法的位置继续。叫它的地方是(7)。
在(7),它通过返回N * 1(即2 * 1 = 2)退出该方法,并从调用此方法的地方继续。叫它的地方是(8)。
在(8)处,它通过返回N * 2(即3 * 2 = 6)退出该方法,并从调用此方法的位置继续。调用它的地方是主要方法(9)。
答案 1 :(得分:0)
if语句仅在参数N
等于或小于1时返回1,否则将执行else子句。在else子句中,由于它返回参数N
与返回值factorial(N-1)
的乘积,因此Java需要等待factorial(N-1)
返回值才能进行乘法并返回价值。因为参数也是变量,所以不需要将参数N
的值存储到字段中,只需从方法的调用者传递它的值即可。
在您的代码中,factorial
被调用4次。