为什么递归会这样做?

时间:2014-02-04 06:00:21

标签: java recursion

class Java_code {
public static void main(String args[]){

    mymethod(5);
}
static void  mymethod(int counter){
    if(counter==0){
    System.out.println("");
    }
    else {
    System.out.println("Hello" + counter);
    mymethod(--counter);
    System.out.println("" +counter);
    }
}
}

假设我们有上面的程序,当我给出参数5它打印

Hello5

Hello4

Hello3

Hello2

Hello1

之后打印

  

0

     

1

     

2

     

3

     

4

,但为什么会打印数字,它是如何发生的?我不明白你怎么会这样帮助我呢?

5 个答案:

答案 0 :(得分:1)

请记住,只要反击!= 0

,就会执行这三行

System.out.println(“Hello”+ counter);

的MyMethod( - 计数器);

System.out.println(“”+ counter);

最初使用counter = 5调用mymethod()。因此它打印“Hello5”并在它返回之前,它以counter = 4递归调用自身,因此打印“Hello4”并在它返回之前,它以递归方式调用自身counter = 3因此打印“Hello3”并在它返回之前,它以counter = 2递归调用自身,因此打印“Hello2”并在它返回之前,它会以counter = 1递归调用自身,因此打印“Hello1”并在它之前返回时,它以counter = 0递归调用自身,此时它只打印任何内容,但返回给调用者,调用者将执行其余的代码 System.out.println(“”+ counter) 在每个正在进行的先前执行中,所以在返回初始调用函数的过程中,它会分别打印值0,1,2,3,4。

答案 1 :(得分:0)

如果仔细观察,可以看到这一行

的MyMethod( - 计数器);

这会降低counter的值,然后将其作为参数传递给mymethod

只要计数器>这将被调用。 0,然后该方法将一直返回。 在每个方法返回后,将执行System.out.println("" +counter);

counter每次调用都会记住mymethod的价值

答案 2 :(得分:0)

  why does it prints numbers , how does it happen ? 
I don't understand how that happens can you help me out on this?

因为你的代码中有这一行

mymethod(--counter); - >递归调用所以这行直接打印(Hello world 1到5。)

之后只执行此行

 System.out.println("" +counter);

这称为stack buffer overflow

答案 3 :(得分:0)

System.out.println("" +counter);

打印这些数字。因为stack unwinding(每当方法调用发生时,当前状态被推入堆栈)并且因为堆栈是LIFO (Last In first out)所以它以相反的顺序打印

答案 4 :(得分:0)

如果你在使用递归的任何时候绘制步骤以及变量的当前值,它将帮助你更好地理解发生的事情,因为它可能会在开始时变得混乱,直到你更熟悉它。