遞迴和迭代 深究遞迴和迭代的區別 優缺點及例項對比

2021-10-16 03:35:13 字數 2303 閱讀 9673

從「程式設計之美」的角度看,可以借用一句非常經典的話:「迭代是人,遞迴是神!」來從巨集觀上對二者進行把握。

從概念上講,遞迴就是指程式呼叫自身的程式設計思想,即乙個函式呼叫本身;迭代是利用已知的變數值,根據遞推公式不斷演進得到變數新值的程式設計思想。

遞迴就是函式自己呼叫自己。

子問題須與原始問題為同樣的事,且更為簡單;

不能無限制地呼叫本身,須有個出口,化簡為非遞迴狀況處理。

第一:每一級的函式呼叫都有自己的變數。

第二:每一次函式呼叫都會有一次返回。

第三:遞迴函式中,位於遞迴呼叫前的語句和各級被呼叫函式具有相同的執行順序。

第四:遞迴函式中,位於遞迴呼叫後的語句的執行順序和各個被呼叫函式的順序相反。

第五:雖然每一級遞迴都有自己的變數,但是函式**並不會得到複製。

例:

int f(int n)  else }
解析:

具體步驟:

遞迴遞迴,有遞就得有歸(出口),只遞不歸會導致程式崩潰。

要得到n - 1的積直接呼叫 f(x) 這個函式就行了,完全不需要思考這個函式怎麼執行的。

乙個台階總共有n級,如果一次可以跳1級,也可以跳2級。求總共有多少總跳法。i第一行輸入t,表示有多少個測試資料。接下來t行,每行輸入乙個數n,表示台階的階數。

輸出時每一行對應乙個輸出。

假如一共有**台階,一共有多少種走法?

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

當n > 2 時,如果走1級有多少種走法+如果走2級有多少種走法,就是n級台階所有的走法。

int fun(int n)  else }
int fun(int n)     return x;}
遞迴與普通迴圈的區別是:迴圈是有去無回,而遞迴則是有去有回(因為存在終止條件)。

在迴圈的次數較大的時候,迭代的效率明顯高於遞迴。

迭代的方式有所不同,假如有個產品要求6個月交貨,我在第乙個月就會拿出乙個產品來,當然,這個產品會很不完善,會有很多功能還沒有新增進去,bug很多,還不穩定,但客戶看了以後,會提出更詳細的修改意見,這樣,你就知道自己距離客戶的需求有多遠,我回家以後,再花乙個月,在上個月所作的需求分析、框架設計、**、測試等等的基礎上,進一步改進,又拿出乙個更完善的產品來,給客戶看,讓他們提意見。

就這樣,我的產品在功能上、質量上都能夠逐漸逼近客戶的要求,不會出現我花了大量心血後,直到最後發布之時才發現根本不是客戶要的東西的情況。

這個過程也很像打遊戲,你剛開始玩,一下子就輸了,但是隨著你玩的次數越來越多,你的技藝就越來越精湛,而這個結果,不是你在開始玩遊戲的時候,規劃出來的,而是在你玩的過程中,通過不斷的輸不斷的輸,練出來的。

所以,你能達成的結果,都是在你做的過程中,不斷試錯,不斷調整,不斷精進,最後自然而然得到的乙個結果。

所以,我們不能把迭代簡單的理解為「公升級」。

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

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

1.重複:

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

2.改進

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

3.認知公升級

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

遞迴和迭代區別

遞迴和迭代 遞迴的實現是通過呼叫函式本身,函式呼叫的時候,每次呼叫時要做位址儲存,引數傳遞等,這是通過乙個遞迴工作棧實現的。具體是每次呼叫函式本身時需要儲存的內容有區域性變數 形參 函式位址等,那麼,如果遞迴呼叫n次,則遞迴棧裡需要儲存n 區域性變數,n 形參,n 函式位址個記憶體空間,很可能導致空...

遞迴和迭代 迭代與遞迴

很多程式設計小白都會遇到 迭代 和 遞迴 的問題 包括我自己 大部分同學還是不知道迭代與遞迴的區別。下面我就嘗試用最通俗易懂的模式講解遞迴與迭代的區別。1.迭代 迭代其實很簡單,我們在程式設計中經常用到迭代。比如說 i 1 print i 這個就是乙個迭代,沒想到吧。迭代的意思其實就是在迴圈 現了參...

遞迴和迭代的區別

遞迴的基本概念 程式呼叫自身的程式設計技巧稱為遞迴,是函式自己呼叫自己.乙個函式在其定義中直接或間接呼叫自身的一種方法,它通常把乙個大型的複雜的問題轉化為乙個與原問題相似的規模較小的問題來解決,可以極大的減少 量.遞迴的能力在於用有限的語句來定義物件的無限集合.使用遞迴要注意的有兩點 1 遞迴就是在...