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;
}
}
}
运行上面的代码,我得到24? 我不太明白怎么做?
我的疑惑: 1.当m = 1,n = 4时,我们称之为prod,直到m和n等于1。 那么输出应该是n,否则不应该执行块??
有人请帮助我理解逻辑。
答案 0 :(得分:1)
只需使用数字运行,您需要将其写下来以确切地查看行为(将来,我建议在代码中添加大量打印以检查变量以及每次传递时它们如何变化)。 / p>
prod(1,4)
m=1,n=4
m != n so, recurse = prod(1, 3)
prod(1, 3)
m=1,n=3
m != n so, recurse = prod(1, 2)
prod(1, 2)
m=1,n=2
m != n so, recurse = prod(1, 1)
prod(1, 1)
m=1,n=1
m == n so,
return 1
returns to prod(1, 2)
recurse = 1
result = 2 * 1
return 2
returns to prod(1, 3)
recurse = 2
result = 3 * 2
return 6
returns to prod(1, 4)
recurse = 6
result = 4 * 6
return 24
因此,您的程序打印24。
有时,找出一个程序的最佳方法是逐行机械地执行这些步骤,在头脑中执行它们(或在纸上执行以跟踪事物)。
答案 1 :(得分:0)
要理解带有函数的任何程序,您可以假设被调用的函数正确执行它们,并检查调用函数是否使用正确的参数以正确的顺序调用它们,并正确地组合结果。
对于递归函数,您需要检查每个递归调用是否使您更接近没有递归的情况。
这里没有人告诉我们应该是什么结果。递归在m == n
结束时递归,递归调用在n = n - 1
,因此仅在m <= n
时才会起作用。
考虑一系列调用,每个调用将n
减少1,而m
保持不变。说n == m + 3
找出发生的情况:第一个电话获得m + 2
,第二个电话m + 1
,第三个m
,然后返回m
。第二个需要n == m + 1
由第三个返回m
,第二个需要n == m + 2
并乘以之前的结果,最后结果为(m + 3) * (m + 2) * (m + 1) * m
。如果n! / (m - 1)!
,此函数会计算n >= m
。知道这是正在发生的事情,很容易检查我们(到现在为止)的预感是否正确。
答案 2 :(得分:0)
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;
}
}
可以用m == 1转换为:
prodA(4);
public static int prodA(int n) {
if (1 == n) {
return n;
} else {
int recurse = prodA(n-1);
int result = n * recurse;
return result;
}
}
有一个转换(头部递归):
public static int prodA(int n) {
int result = 1;
while (n > 1) { // Actually n != 1
result *= n;
--n;
}
return result;
}
这是阶乘函数。