淺談遞歸、迭代、循環、遍歷 以及用遞歸思想求解漢諾塔(hanoi)問題、斐波那契數列、累加問題

概念介紹:

循環:在滿足條件的情況下,重複執行同一段代碼來解決問題的方法,如while循環。

遞歸:通過直接或間接的反覆在函數內部調用自身來解決問題的方法。

迭代:按順序訪問線性結構中的每一項,如for循環。

遍歷:按照一定的規則訪問非線性結構中的每一項。

 

循環我其他文章裏面介紹過啦~如果大家感興趣,可以去我的博客主頁看看吧~裏面詳細講了for循環以及一些經典的練習題,如打印金字塔等,在清楚for循環 循環結構體裏面的循環的初始化 ,循環的繼續條件和循環的步長 是如何得來的同時大家也可以更好地理解迭代思想。何樂而不爲呢?今天我主要想跟大家分享一下我對 遞歸 的理解。

說到遞歸,就得先說說 分治 。何爲分治呢

分治其實是一種算法思想,它主要是將一些複雜的大問題進行拆分,拆分成若干個與原問題性質類似的小問題,這些小問題相對而言比較簡單,可以方便的對其進行求解,那麼最終將每個小問題的解進行合併得到原問題的解的過程就是我們所說的分治思想啦。

而遞歸就是運用分治的思想來解決問題的。那麼何爲遞歸呢遞歸遞歸,先遞後歸

遞歸與迭代的區別:

遞歸就是,你愛人與你的相愛過程,你們遇見、曖昧、相戀,最終你們會拿着結婚證走進婚姻的殿堂。總而言之就是有結果。而迭代就是 你遇見渣男了,一直曖昧,走不進婚姻的殿堂沒結果。看到沒?遞歸是你愛人愛你有結果,迭代是你愛渣男沒結果。正經來說就是,遞歸是逆向思維代碼比較整潔簡單有結果,而迭代是正向思維代碼比較繁瑣沒結果。

 

問題1:累加問題:計算1+2+3+4+……+98+99+100

解題思路:假設 f(n) 是求1~n的累加,那麼求解f(100)就是我們當前最大的問題。按照做題步驟,先對其進行拆分,直到拆的不能再拆的時候,對其進行求解,最後向上返回即可。圖示如下(↓)一定要記住,先遞再歸。

代碼展示:

    public static int f(int n){
        if(n==1){
            return 1;
        }
        return f(n-1)+n;
    }

 

遞歸的解題步驟分爲那幾步呢?

  • 前進段:指的就是將問題從大化小
  • 結束段:不斷分解小問題直到可以方便求出小問題的解爲止
  • 返回段:將小問題處理完畢之後,向上返回(有些問題是不需要返回的)

 

問題2:Hanoi問題(漢諾塔)

問題簡介:漢諾塔是一個發源於印度的益智遊戲,也叫河內塔。相傳它源於印度神話中的大梵天創造的三個金剛柱,一根柱子上疊着上下從小到大64個黃金圓盤。大梵天命令婆羅門將這些圓盤按從小到大的順序移動到另一根柱子上,其中大圓盤不能放在小圓盤上面。當這64個圓盤移動完的時候,世界就將毀滅。 那麼好多人會問64個圓盤移動到底會花多少時間?那麼古代印度距離現在已經很遠,這64個圓盤還沒移動完麼?我們將通過遞歸算法來計算來看看要完成這個任務到底要多少時間?

算法講解:最大的問題將X上的三個盤子上放到Z上,以3個爲例:

最初的3個圓環都在X上面放着,目的是將X上面的3個圓環放在Z上,即X->Z ,

第一步:先將前一個從X移到Z,再將第二個從X移到Y,再將前一個從Z移到Y()

第二步:將第三個從X移到Z

第三步:先將前一個從Y移到X,再將第二個從Y移到Z,再將前一個從X移到Z()

總結:要想把3個從X移到Z,先得把前兩個從X 移到 Y,再把第三個從X移到Z,最後再把前兩個從Y移到Z即可。

那麼64層漢諾塔對應的就是:先把前63個 X->Y,再把第64個 X->Z,最後把前63個 Y->Z即可。

 

代碼展示
        

class Hanno{
    public static void main(String[] args){
        //盤子的個數 出發 中間 目的
        hanno(64,"X","Y","Z");
    }                                     
    public static void hanno(int n,String begin,String mid,String end){
        if(n==1){
            System.out.println(begin+" -> "+end);
        }else{
            hanno(n-1,begin,end,mid);
            System.out.println(begin+" -> "+end);
            hanno(n-1,mid,begin,end);
        }
    }
}

 

程序給出的就是移動的路徑,經過計算要移完64個盤子大約得移動18446744073709551615次。
我們假設移動一次圓盤爲一秒,那麼一年爲31536000秒。那麼18446744073709551615/31536000約等於584942417355天,換算成年爲5845.54億年。 
目前太陽壽命約爲50億年,太陽的完整壽命大約100億年。所以我們整個人類文明都等不到移動完整圓盤的那一天。

 

問題3:斐波那契數列  1 1 2 3 5 8 13 21 34 55 ......

代碼展示:

public static int fibo(int n){
        if(n==1||n==2){
            return 1;
        }
        return fibo(n-1)+fibo(n-2);
    }

 

發佈了16 篇原創文章 · 獲贊 25 · 訪問量 3149
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章