java中的遞歸方法(簡單實現)

轉自http://www.cnblogs.com/renxiaoren/p/4568745.html

一、含義

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

二、例子

  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循環就執行了一個方法,壓入棧幀一次,只存在一個棧幀,所以比較節省內存。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章