Java 如何跟踪递归?
我在网上看到了这段代码,但我想问的是程序是如何给出Java 如何跟踪递归?,java,recursion,Java,Recursion,我在网上看到了这段代码,但我想问的是程序是如何给出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); } 试着一步一步地走过去: addxy(
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);
}
试着一步一步地走过去:
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
这个
返回1
加上从b
中删除1
时递归调用方法的结果。这基本上意味着它添加了b
当b
为0
时,返回a
else if (b==0)
return a;
(当a
为0
时,也返回b
您甚至不需要跟踪任何内容,就可以知道(对于
a
和b
使用非负值),该方法只需添加a
和b
并返回结果。查看返回语句
return 1 + addxy(a, b-1);
在同一个函数的return
语句中有一个函数调用。这被称为递归函数
。因此只要b不是0
,它就会继续再次调用它,但是通过添加1
并减去b
,直到b
变成0
。这就是为什么你得到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;
- addxy(6,6)
- 1+addxy(6,5)
- 1+1+addxy(6,4)
- 1+1+1+addxy(6,3)
- 1+1+1+1addxy(6,2)
- 1+1+1+1+1+1+addxy(6,1)
- 1+1+1+1+1+1+1+addxy(6,0)=12
因为@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;
,现在回溯此答案,形成下图
也许你现在能理解它了那么你的跟踪错误了。我仍然不明白!!它返回1和方法的调用…也就是1..为什么它有addxy(6,1)它一定是addxy(6,5)所以6+5=11…我还是不明白…请帮帮我…我太蠢了..不..答案是12看它加上了所有的值。a的值仍然是6。它返回1加上方法的名称…现在使用a=6和b=5…然后它再次落在同一个语句中,添加1和b=4…并使用同一个语句…我仍然不明白…我太蠢了return语句,函数被再次调用。请阅读递归函数。可能您会得到更好的图片我已经阅读了有关递归函数的内容!!!太难理解了…我可以更好地理解循环…但我必须知道这一点(我不知道在哪里向你解释,因为评论不是这样做的地方。但无论如何,想想看,每次执行第三个return语句时都会调用该函数。来JAVA聊天->上面的解决方案出了什么问题。请告诉我,为什么给-1分?@RavenMaddison我很抱歉。但我想知道是谁给了我否决票。)不给任何理由,反正没问题。
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;