需要帮助来解密Java中的析因代码

时间:2018-07-22 09:34:55

标签: java

我已经理解了使用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 的方式(我了解过程的进行方式-它是一个自我调用的函数)。

这是我(错误地)解释此代码的说明:

  1. factorial(4)被称为
  2. 4大于1,因此else语句将运行-4*factorial(3)
  3. factorial(3)被称为-else语句再次运行-3*factorial(2)
  4. factorial(2)被称为-2*factorial(1)。此时,我们有4 * 3 * 2 * 1,但是代码仅在if (N<=1) return 1行停止的事实意味着返回1而不是总和吗? (我显然错了,因为控制台打印了正确的数字-24

2 个答案:

答案 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次。