java中的遞歸方法


一、含義

      遞歸算法是一種直接或間接地調用自身的算法。在計算機編寫程序中,遞歸算法對解決一大類問題是十分有效的,它往往使算法的描述簡潔而且易於理解。

二、例子

  99乘法表的例子  

1:普通實現99乘法表太簡單,是個程序員都會,實現如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package test.ms;
 
public class Test99 {
  
   public static void main(String[] args) {
  
   for ( int i= 1 ; i<= 9 ;i++){
    for ( int j= 1 ; j<=i; j++){
    System.out.print(j+ " * " +i+ " = " +(i*j) + " " );
    }
    System.out.println();
   }
}
   
}

2:用遞歸方式實現 99乘法表
代碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package test.ms;
 
public class MultiTable {
  public static void main(String args[]) {
     m( 9 );
   }
  
   /**
    * 打印出九九乘法表
    * @param i
    */
   public static void m( int i) {
     if (i == 1 ) {
       System.out.println( "1*1=1 " );
     } else {
       m(i - 1 );
       for ( int j = 1 ; j <= i; j++) {
         System.out.print(j + "*" + i + "=" + j * i + " " );
       }
       System.out.println();
     }
  
}

遞歸的方式調用圖示:

每一個方法的調用都會產生一個棧幀,壓入到方法棧,當遞歸調用的時候,方法棧中棧幀的圖示和上圖類似。
去掉方法中棧幀的引用關系更加直觀:如下圖所示:

簡化掉相應的方法調用最后執行情況如上圖所示,注意 i 一直在變  j每次都是從1開始 然后遞增到和i相等。
這樣上圖依次出棧后就得到了 99 乘法表:

總結:

嵌套for循環 和  用遞歸實現 的比較:

棧 主要是用來存放棧幀的,每執行一個方法就會出現壓棧操作,所以采用遞歸的時候產生的棧幀比較多,遞歸就會影響到內存,非常消耗內存,而使用for循環就執行了一個方法,壓入棧幀一次,只存在一個棧幀,所以比較節省內存。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM