1. 程式人生 > >java中的遞迴方法和for迴圈

java中的遞迴方法和for迴圈

一、含義

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

二、例子

  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(); } }

http://files.jb51.net/file_images/article/201503/2015328100552320.png?20152281060&_=4568745

遞迴的方式呼叫圖示:

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

http://files.jb51.net/file_images/article/201503/2015328100610807.png?201522810618&_=4568745

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

總結:

巢狀for迴圈 和  用遞迴實現 的比較:

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