如何追踪递归?

时间:2015-02-15 07:58:45

标签: java recursion

我在网上看到了这段代码,但我问的是该程序是如何得出12的答案的?

我对该计划进行了追踪,我只得到6的回答。

为什么答案是12

输入为a=6b=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);
}

5 个答案:

答案 0 :(得分:2)

  • 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 + addxy(6,1)
  • 1 + 1 + 1 + 1 + 1 + 1 + addxy(6,0)= 12

答案 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

b0时,您返回a

else if (b==0)
    return a;

(当ba时,您也会返回0

如果没有跟踪任何内容,您可以告诉它(ab的非负值)该方法只需添加ab并返回结果。

答案 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;

,现在回溯这个答案,形成下面的图像

Recusrsion

现在你可以理解它了