深究遞歸和迭代的區別、優缺點及實例對比

1.迭代是人,遞歸是神!

從「編程之美」的角度看,能夠借用一句很是經典的話:「迭代是人,遞歸是神!」來從宏觀上對兩者進行把握。編程

從概念上講,遞歸就是指程序調用自身的編程思想,即一個函數調用自己;迭代是利用已知的變量值,根據遞推公式不斷演進獲得變量新值得編程思想。框架

2.遞歸

遞歸就是函數本身調用本身。ide

2.1構成遞歸需具有的條件:

  1. 子問題須與原始問題爲一樣的事,且更爲簡單;

2. 不能無限制地調用自己,須有個出口,化簡爲非遞歸情況處理。函數

2.2遞歸的基本原理

第一:每一級的函數調用都有本身的變量。測試

第二:每一次函數調用都會有一次返回。優化

第三:遞歸函數中,位於遞歸調用前的語句和各級被調用函數具備相同的執行順序。設計

第四:遞歸函數中,位於遞歸調用後的語句的執行順序和各個被調用函數的順序相反。3d

第五:雖然每一級遞歸都有本身的變量,可是函數代碼並不會獲得複製。code

2.3遞歸優缺點

深究遞歸和迭代的區別、優缺點及實例對比

2.4編寫一個遞歸函數

  • 這個遞歸函數的功能是什麼,怎樣調用這個函數,即設計好遞歸函數的返回值和參數列表blog

  • 何時應該結束這個遞歸,它的邊界條件(出口)是什麼(邊界條件)

  • 在非邊界狀況時,怎樣從第n層轉變成第n+1層(遞推公式)

例:

int f(int n) {
  //出口
    if (n > 0) {
        return n + f(n - 1);
    } else {
        return 0;
    }
}

解析:

深究遞歸和迭代的區別、優缺點及實例對比

 具體步驟:

深究遞歸和迭代的區別、優缺點及實例對比

遞歸遞歸,有遞就得有歸(出口),只遞不歸會致使程序崩潰。

要獲得n - 1的積直接調用 f(x) 這個函數就好了,徹底不須要思考這個函數怎麼執行的。

3.例題:走樓梯

3.1題目描述:

一個臺階總共有n級,若是一次能夠跳1級,也能夠跳2級。求總共有多少總跳法。I第一行輸入T,表示有多少個測試數據。接下來T行,每行輸入一個數n,表示臺階的階數。
輸出時每一行對應一個輸出。

假如一共有三級臺階,一共有多少種走法?

深究遞歸和迭代的區別、優缺點及實例對比

假設有n級臺階,一共有多少種走法?

深究遞歸和迭代的區別、優缺點及實例對比

當n > 2 時,若是走1級有多少種走法 + 若是走2級有多少種走法,就是n級臺階全部的走法。

4.求n!遞歸法

int fun(int n) {
    if (n == 1) {
        return 1;
    } else {
        return n * fun(n - 1);
    }
}

5.求n!迭代法

int fun(int n) {
    int x = 1;
    for (int i = 2; i <= n; i++) {
        x *= i;
    }
    return x;
}

6.迭代

  迭代與普通循環的區別是:迭代時,循環代碼中參與運算的變量同時是保存結果的變量,當前保存的結果做爲下一次循環計算的初始值。

  遞歸與普通循環的區別是:循環是有去無回,而遞歸則是有去有回(由於存在終止條件)。

  在循環的次數較大的時候,迭代的效率明顯高於遞歸。

6.1現實中的迭代

  迭代的方式有所不一樣,假若有個產品要求6個月交貨,我在第一個月就會拿出一個產品來,固然,這個產品會很不完善,會有不少功能尚未添加進去,bug不少,還不穩定,但客戶看了之後,會提出更詳細的修改意見,這樣,你就知道本身距離客戶的需求有多遠,我回家之後,再花一個月,在上個月所做的需求分析、框架設計、代碼、測試等等的基礎上,進一步改進,又拿出一個更完善的產品來,給客戶看,讓他們提意見。
就這樣,個人產品在功能上、質量上都可以逐漸逼近客戶的要求,不會出現我花了大量心血後,直到最後發佈之時才發現根本不是客戶要的東西的狀況。

6.2優點

這個過程也很像打遊戲,你剛開始玩,一會兒就輸了,可是隨着你玩的次數愈來愈多,你的技藝就愈來愈精湛,而這個結果,不是你在開始玩遊戲的時候,規劃出來的,而是在你玩的過程當中,經過不斷的輸不斷的輸,練出來的。

因此,你能達成的結果,都是在你作的過程當中,不斷試錯,不斷調整,不斷精進,最後天然而然獲得的一個結果。

因此,咱們不能把迭代簡單的理解爲「升級」。

升級,更多描述的是一個結果,是一種直接的,一次性的,達成的一個目標,是一種線性的進程。

而迭代,是經過無數次,不斷的,重複的,接近一個目標,折返接近,再折返再接近,最終達到目標。它不是一次性完成的,是經過不斷重複的,但每次重複又比以前更好一點,這樣一種非線性的進程。

如今咱們把「迭代」的關鍵詞拆解一下:

1.重複:

不斷的重複作,而不是一次性的完成。

2.改進

在作的過程當中不斷的改進、調整、優化。

3.認知升級

迭代的過程就是不斷提升認知的過程,升級只是這個過程的一個結果。

相關文章
相關標籤/搜索