需要帮助理解给定程序中的递归

时间:2016-02-19 16:12:57

标签: java recursion

好的,这个程序的输出是

hello3
hello2
hello1

0
1
2

我需要在mymethod( - counter)之后进行解释,为什么输出为0,1,2而不是3,2,1(PS int计数器的值为' 3' )

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

}

`

3 个答案:

答案 0 :(得分:2)

在递归期间发生的事情是,每次循环时,它会调用自身,参数减1,直到达到0.所以你有

  • import React from 'react'; const SomeComponent = ({ message }) => ( <div>{message}</div> ); SomeComponent.propTypes = {}; export default SomeComponent; 调用mymethod(3)
  • 这会调用mymethod(2)
  • 这会调用mymethod(1)

现在到此为止,mymethod(0)位于堆栈的顶部。当递归被解开时,方法以相反的顺序完成,因此mymethod(1)先完成,然后mymethod(0)完成,最后mymethod(1)完成。

把它想象成一堆不同大小的盘子:当你把盘子堆起来时,你把它们从最大到最小;当你再把它们拿走时,你会把它们从最小到最大。

答案 1 :(得分:1)

由于你得到hello3作为第一个输出,你可能在第一次调用myMethod()时传入3作为参数:

//Imagine invoking myMethod() from the main..
public static void main(String[] args){
    myMethod(3);

}

调用 myMethod(3)会导致以下情况:

public void mymethod(3){
    if(counter==0)
        System.out.println("");
    else{                                       // <=== came into else block
        System.out.println("hello" + counter);  // <=== print "hello3"
        mymethod(--counter);                    // <=== invoke myMethod(2)
        System.out.println(" " +counter);
    }
}

调用 myMethod(2)会导致以下情况:

public void mymethod(2){
    if(counter==0)
        System.out.println("");
    else{                                       // <=== came into else block
        System.out.println("hello" + counter);  // <=== print "hello2"
        mymethod(--counter);                    // <=== invoke myMethod(1)
        System.out.println(" " +counter);
    }
}

调用 myMethod(1)会导致以下情况:

public void mymethod(1){
    if(counter==0)
        System.out.println("");
    else{                                       // <=== came into else block
        System.out.println("hello" + counter);  // <=== print "hello1"
        mymethod(--counter);                    // <=== invoke myMethod(0)
        System.out.println(" " +counter);
    }
}

调用 myMethod(0)会导致以下情况:

public void mymethod(0){
    if(counter==0)                              // <=== if-condition is true
        System.out.println("");                 // <=== print newline
    else{                                       
        System.out.println("hello" + counter);  
        mymethod(--counter);                    
        System.out.println(" " +counter);
    }
} // <=== exit method (goes back to last point where this myMethod(0) was callled)

myMethod(1) 继续:

public void mymethod(1){
    if(counter==0)
        System.out.println("");
    else{                                       
        System.out.println("hello" + counter);  
        mymethod(--counter);                    // <=== this point invoked myMethod(0)
        System.out.println(" " +counter);       // <=== continue from here (print " " + 0)
    }
} // <=== exit method (goes back to last point where this myMethod(1) was called  

myMethod(2) 继续:

public void mymethod(2){
    if(counter==0)
        System.out.println("");
    else{                                       
        System.out.println("hello" + counter);  
        mymethod(--counter);                    // <=== this point invoked myMethod(1)
        System.out.println(" " +counter);       // <=== continue from here (print " " + 1)
    }
} // <=== exit method (goes back to last point where this myMethod(2) was called 

myMethod(3) 继续:

public void mymethod(3){
    if(counter==0)
        System.out.println("");
    else{                                       
        System.out.println("hello" + counter);  
        mymethod(--counter);                    // <=== this point invoked myMethod(2)
        System.out.println(" " +counter);       // <=== continue from here (print " " + 2)
    }
} // <=== exit method (goes back to last point where this myMethod(3) was called 

返回main()

public static void main(String[] args){
    myMethod(3);
    //<=== continue from this point
}

答案 2 :(得分:0)

递归函数可视化很棘手。

将调用函数视为堆栈,并在其上面调用函数。当被调用函数最终终止并且不调用另一个函数时,程序返回到堆栈上的下一个函数,该函数结束然后返回堆栈上的下一个函数,等等。

所以,打印的行&#34;你好&#34;调用+ counter,然后函数调用mymethod(--counter)。整个过程(降至mymethod(0)并返回)必须在第二个打印语句之前发生。

因此,您的程序打印hello3,hello2和hello1,将mymethod(3)mymethod(2)mymethod(1)放在堆栈上。它到达mymethod(0),打印一个空字符串,然后按顺序返回mymethod(1)mymethod(2)mymethod(3)。在每种情况下,它都会打印--counter,这比参数中的计数器少一个。有意义吗?