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)
答案 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