有人可以解释这个程序吗?

时间:2015-01-16 05:18:26

标签: java recursion

public class Prod{

    public static void main(String[] args) {
        System.out.println(prod(1, 4));
    }

    public static int prod(int m, int n) {
        if (m == n) {
            return n;
        } else {
            int recurse = prod(m, n-1);
            int result = n * recurse;
            return result;
        }
    }
}

我已经在这里阅读了一个解决方案:JAVA Recursive Program logic这是有道理的,但我不明白为什么当它击中prod(1,1)时它会回到prod(1,2)

3 个答案:

答案 0 :(得分:0)

它会返回n的阶乘,最小值为m。像

n * (n-1) * (n-2) * (n-3) * (n-4) * (n-5) ... till (n-x) != m

答案 1 :(得分:0)

因为它有prod(1,2)和堆栈中的其他方法。每次调用prod(m,n)时,它都会递归调用prod(m,n-1)。这将持续到m==n,在您的情况下为prod(1,1)。此处prod(1,1)会将值返回给调用方法prod(1,2)

    //method prod(1,2)
          ....
     int recurse = prod(m, n-1);//here it will get value 1 returned from prod(1,1)
     int result = n * recurse; // 2*1
     return result; // return 2 to calling method prod(1,3)

因此,当最终递归调用在prod(1,1)结束并返回值时。调用堆栈中存在的所有先前prod()将执行每一个从被调用prod(m,n-1)返回的

答案 2 :(得分:0)

不确定。让我们添加一些formatted output的日志记录,我建议你使用Conditional Operator ? :之类的

public static int prod(int m, int n) {
    int recurse = (n != m) ? prod(m, n - 1) : 1;
    int r = n * recurse;
    System.out.printf("m=%d, n=%d, recurse = %d, returning %d%n", m, n,
            recurse, r);
    return r;
}

输出应该解释你的结果

m=1, n=1, returning 1
m=1, n=2, recurse = 1, returning 2
m=1, n=3, recurse = 2, returning 6
m=1, n=4, recurse = 6, returning 24
24