我在网上看到了这段代码,但我问的是该程序是如何得出12
的答案的?
我对该计划进行了追踪,我只得到6
的回答。
为什么答案是12
?
输入为a=6
和b=6
。
这是代码:
public static int addxy(int a, int b)
{
if (a==0)
return b;
else if (b==0)
return a;
else
return 1 + addxy(a, b-1);
}
答案 0 :(得分:2)
答案 1 :(得分:1)
尝试一步一步地走过它:
addxy(6, 6) returns 1 + addxy(6, 5)
addxy(6, 5) returns 1 + addxy(6, 4)
addxy(6, 4) returns 1 + addxy(6, 3)
addxy(6, 3) returns 1 + addxy(6, 2)
addxy(6, 2) returns 1 + addxy(6, 1)
addxy(6, 1) returns 1 + addxy(6, 0)
addxy(6, 0) returns 6
So, addxy(6, 1) returns 1 + 6 = 7
So, addxy(6, 2) returns 1 + 7 = 8
So, addxy(6, 3) returns 1 + 8 = 9
So, addxy(6, 4) returns 1 + 9 = 10
So, addxy(6, 5) returns 1 + 10 = 11
So, addxy(6, 6) returns 1 + 11 = 12
答案 2 :(得分:0)
这个
return 1 + addxy(a, b-1);
返回1
以及从1
移除b
时递归调用该方法的结果。这基本上意味着它增加了b
。
当b
为0
时,您返回a
。
else if (b==0)
return a;
(当b
为a
时,您也会返回0
。
如果没有跟踪任何内容,您可以告诉它(a
和b
的非负值)该方法只需添加a
和b
并返回结果。
答案 3 :(得分:0)
查看return
声明
return 1 + addxy(a, b-1);
您在return
语句中对同一函数进行了函数调用。这称为recursive function
。因此,只要b不是0
,它就会继续再次调用n,但会添加1
并按b
减去1
。这一直持续到b
变为0
。这是6次。这就是为什么你得到1*6 + a = 6
等效执行将是
return 1 + addxy(6, 5);
return 1 + 1 + addxy(6, 4);
return 1 + 1 + 1 + addxy(6, 3);
return 1 + 1 + 1 + 1 + addxy(6, 2);
return 1 + 1 + 1 + 1 + 1 + addxy(6, 1);
return 1 + 1 + 1 + 1 + 1 + 1 + addxy(6, 0);
return 1 + 1 + 1 + 1 + 1 + 1 + 6; // Value of a = 6
return 12;
答案 4 :(得分:-1)
由于@Mureinik答案很完美,但你不理解,
因此,让我们从一个非常基本的通过递归计算因子的例子开始:
public int factorial(int num){
if(num==0) //break condition of Recursion Since 0! is always 1
return 1;
return num*fact(num-1);
}
所以这是追踪
factorial(4) return 4*factorial(3);
factorial(3) return 3*factorial(2);
factorial(2) return 2*factorial(1);
factorial(1) return 1*factorial(0);
factorial(0) returns 1;
,现在回溯这个答案,形成下面的图像
现在你可以理解它了