Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何跟踪递归?_Java_Recursion - Fatal编程技术网

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;