在调用自身的方法之后有一个return语句时,在Java中递归

时间:2013-03-18 21:38:25

标签: java recursion

代码:

public static void main(String[] args) {
    System.out.println(test(13549));
}    

public static int test(int a){
    if(a<10)
        return a;
    int b = (a%10);
    int c = test(a/10);
    int d = Math.max(b,c);
    return d;
}

我理解该方法的作用(在使用调试器之后)并且我理解该方法调用自身直到它小于10并且它运行并检查什么更大,b或c。 现在我不明白的是,为什么当有返回语句return d;时它返回到int c = test(a/10)而不是int test(int a){方法的开头。

5 个答案:

答案 0 :(得分:3)

return语句返回对test 的调用的输出。因此,在第return d;行,它只是在行test(a/10)中返回c = test(a/10)的值。

答案 1 :(得分:1)

这是递归的基本思想 - 当你在自己内部调用方法时,它不仅仅是跳回到方法的开头。

目视:

1
|
|  2
|__|
|  |  3
|  |__|
   |  |  x
   |  |__|
      |  .
      |  .

其中每条垂直线都是函数的运行,而水平线是递归调用。

每次调用后,它都会返回到调用它的方法实例中的位置 实际上,这意味着在第3次递归中,您在堆栈(内存中)中有3个版本的函数,而不是简单地返回到当前函数的顶部3次。

答案 2 :(得分:0)

在跟踪代码时,假设你有一个堆栈(函数执行)。每当你发现函数正在调用自身时,在堆栈顶部放置一个新函数,当函数返回时取出堆栈元素。

你会发现该函数会一直调用自己,直到达到'基本情况' - 当一个&lt; 10。

将一个代码放在一个return语句下面会没有任何好处(在某种语言中它甚至不会编译),一旦函数返回,代码就不会被执行

答案 3 :(得分:0)

每次调用递归函数时,它都从函数顶部开始。因为你在递归函数调用之后定义了d,所以你永远不会得到d。您将继续递归调用您的函数,直到您能够返回。

答案 4 :(得分:0)

当你致电test(13549)时会发生这种情况:

test(13549){
   false
   b=9
   c= test(1354){
       false
       b=4
       c=test(135){
           false
           b=5
           c=test(13){
               false
               b=3
               c=test(1){
                  true
                  return 1
                }
                d=Max(3,1)
                return 3
              }
               d=Max(3,3)
               return 3
             }
             d=Max(5,3)
             return 5
           }
          d=Max(4,5)
          return 5
        }
    d=Max(9,5)
    return 9
  }

很抱歉,如果我可能以任何方式计算错误..但是你可以看到,在所有递归调用完成并且第一个c具有实际值之前,没有达到第一个return语句。