初次接觸java中的遞迴演算法

來源:互聯網
上載者:User

標籤:例子   oid   color   爬樓梯   個數   涵蓋   分析   else   三個月   

一道關於兔子繁衍的編程題:

有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數為多少?

自己考慮了挺久,思路出現了問題,甚至連其中的規律都沒有搞清楚.查看網上的一些演算法之後,發現一個之前沒有使用的思想:遞迴.目前對於遞迴的理解僅限於初級中的初級.

關於這道編程題,應該以這樣的思路來進行考慮:

每個月的兔子的來源是哪些?答:上個月的兔子的個數(不管是否具備繁殖能力) + 2個月前的兔子的個數  在第1和2個月的時候,只有最開始的一對兔子.

這樣想一想的話,就是用上個月的兔子個數 + 上上個月的兔子個數 ,就可以得到本月的兔子的個數.結果恰好是很著名的斐波那契數列.

 

1     public static int method(int month){2         if(month == 1 || month == 2){3             return 1;4         }else{5             int num =  method(month -1) + method(month -2);6             return num;7         }8     }

 

 

 

思想就是結果= 上次程式的結果 + 上上次的程式的結果

後在網上查看有關遞迴的資料,看到另外兩個用遞迴思想解決的問題:爬樓梯問題和漢諾塔問題

 

爬樓梯問題

假設一個樓梯有 N 階台階,人每次最多可以跨 M 階,求總共的爬樓梯方案數。

分析:

台階數(走法) 方法數
1 1 1
2 11 2 2
3 111 12 21 3
4 1111 112 121 211 225

因此可知,這個問題和之前的兔子繁衍問題是一個道理.

 1 public static int f(int n) { 2         if (n == 0) { 3             return 0; 4         } else if (n == 1) { 5             return 1; 6         } else if (n == 2) { 7             return 2; 8         } else { 9 10             return f(n - 1) + f(n - 2);11         }12     }

 

 

漢諾塔問題:

從左至右 A B C 柱 大盤子在下, 小盤子在上, 藉助B柱將所有盤子從A柱移動到C柱,大盤子只能在小盤子下面.

這些問題我想起來比較吃力,但網上解析很多,幾乎涵蓋了我的所有的考慮了,因此,我在這裡只說以下較為簡單快捷的一種理解方式.

 

A,B,C三個針,假設有n個盤子,只需要分成三步,①將(n-1)個盤子從A移動到B,②將最大的盤子從A放到C,③將(n-1)個盤子從B移動到C

f(n) = (f(n-1)*2) + 1;

public static int method(int n){        if(n == 1){            return 0;        }else if(n == 2){            return 1;        }else{            return method(n-1)*2 + 1;        }    }

 

再舉個例子,使用遞迴的思想來列印9*9乘法表

正常若不使用迭代的話,可以這樣來實現代碼,使用兩層嵌套的for迴圈

1 public static void method_1(){2         for(int i = 1;i <= 9;i++){3             for(int j = 1;j <= i;j++){4                 System.out.print(i + "*" + j + "=" + i*j + " ");5             }6             System.out.println();7         }8     }

若使用遞迴的話,問題就變成了:列印上一次的結果並列印新的一行

 1 public static void method_2(int i){ 2          if (i == 1) {  3              System.out.println("1*1=1 ");  4          } else {  5              method_2(i - 1);  6              for (int j = 1; j <= i; j++) {  7                  System.out.print(j + "*" + i + "=" + j * i + " ");  8              }  9              System.out.println(); 10          } 11     }  

 

關於遞迴的應用,大體上來說,就是需要發現並找到程式中的遞迴的情況,將問題簡化.

 

初次接觸java中的遞迴演算法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.