我有这个递归代码
public static int m(int n1, int n2) {
int result;
if (n2 - n1 == 0) {
result = n1; }
else {
int mid = (n1 + n2) / 2;
result = m(n1, mid) * m(mid + 1, n2);
}
return result;
}
但我不明白为什么不执行递归乘法的第二部分,如果我输入参数 (2,3) 结果是 6 但在我下面的计算中是 120
m(2,3)
mid= 5+2=3
m(2,3) * m(4,5)
mid= 2+3/2=2 mid= 4+5/2=4
m(2,2) * m(3,3) m(4,4) * m(5,5)
2 * 3 4 * 5
6 * 20
120
你能解释一下为什么吗谢谢
答案 0 :(得分:1)
我认为您在第一步中计算了中间错误。正确的递归树是 -
m(2,3)
mid = 2 [=5/2]
m(2,2) * m(3,3)
2 * 3
= 6
答案 1 :(得分:0)
这起初可能会让人感到困惑(当然您可以根据自己的需要进行修改),但有时它有助于:
WHERE NAME = NEW.name;
当使用 m(2,5) 运行时,它会打印
public static int m(int n1, int n2) {
System.out.printf("%nMethod entered: n1 = %d n2 = %d%n", n1, n2);
int result;
int firstCall;
int secondCall;
if (n2 - n1 == 0) {
result = n1;
} else {
int mid = (n1 + n2) / 2;
System.out.printf("mid = %d%n", mid);
System.out.printf("firstCall = m(n1 = %d, mid %d)%n", n1,mid);
firstCall = m(n1, mid);
System.out.printf("secondCall = m(mid+1 = %d, n2 = %d)%n",mid+1,n2);
secondCall = m(mid+1,n2);
System.out.printf("result = firstCall{%d} * secondCall{%d}%n", firstCall, secondCall);
result = firstCall * secondCall;
System.out.printf("result = %d%n", result);
}
return result;
}