漫談遞迴 遞迴需要滿足的兩個條件

2021-07-11 22:36:27 字數 1110 閱讀 8412

很多人對遞迴的理解不太深刻。一直就停留在「自己呼叫自己」的程度上。這其實這只是遞迴的表象(嚴格來說連表象都概括得不全面,因為除了「自己呼叫自己」的遞迴外,還有互動呼叫的遞迴)。而遞迴的思想遠不止這麼簡單。

遞迴,並不是簡單的「自己呼叫自己」,也不是簡單的「互動呼叫」。它是一種分析和解決問題的方法和思想。簡單來說,遞迴的思想就是:把問題分解成為規模更小的、具有與原問題有著相同解法的問題。比如二分查詢演算法,就是不斷地把問題的規模變小(變成原問題的一半),而新問題與原問題有著相同的解法。

有些問題使用傳統的迭代演算法是很難求解甚至無解的,而使用遞迴卻可以很容易的解決。比如漢諾塔問題。但遞迴的使用也是有它的劣勢的,因為它要進行多層函式呼叫,所以會消耗很多堆疊空間和函式呼叫時間。

既然遞迴的思想是把問題分解成為規模更小且與原問題有著相同解法的問題,那麼是不是這樣的問題都能用遞迴來解決呢?答案是否定的。並不是所有問題都能用遞迴來解決。那麼什麼樣的問題可以用遞迴來解決呢?一般來講,能用遞迴來解決的問題必須滿足兩個條件:

可以通過遞迴呼叫來縮小問題規模,且新問題與原問題有著相同的形式。

存在一種簡單情境,可以使遞迴在簡單情境下退出。

如果乙個問題不滿足以上兩個條件,那麼它就不能用遞迴來解決。

為了方便理解,還是拿斐波那契數列來說下:求斐波那契數列的第n項的值。

這是乙個經典的問題,說到遞迴一定要提到這個問題。斐波那契數列這樣定義:f(0) = 0, f(1) = 1, 對n > 1, f(n) = f(n-1) + f(n-2)

這是乙個明顯的可以用遞迴解決的問題。讓我們來看看它是如何滿足遞迴的兩個條件的:

對於乙個n>2, 求f(n)只需求出f(n-1)和f(n-2),也就是說規模為n的問題,轉化成了規模更小的問題;

對於n=0和n=1,存在著簡單情境:f(0) = 0, f(1) = 1。

因此,我們可以很容易的寫出計算費波納契數列的第n項的遞迴程式:

int fib(n)
在編寫遞迴呼叫的函式的時候,一定要把對簡單情境的判斷寫在最前面,以保證函式呼叫在檢查到簡單情境的時候能夠及時地中止遞迴,否則,你的函式可能會永不停息的在那裡遞迴呼叫了。

漫談遞迴:遞迴需要的兩個條件

快速尋找滿足條件的兩個數

快速尋找滿足條件的兩個數,讓這兩個數字之和等於乙個給定的數字 快速尋找滿足條件的兩個數,讓這兩個數字之和等於乙個給定的數字 public class searchtwonum quicksort.quicksort a 假設sum 9 int sum 9 設定兩個指標 int low 0,high ...

快速尋找滿足條件的兩個數

2012 04 18 16 41 2.12快速尋找滿足條件的兩個數 程式設計師程式設計藝術之五 第一節 尋找滿足條件的兩個數 第14題 陣列 題目 輸入乙個陣列和乙個數字,在陣列中查詢兩個數,使得它們的和正好是輸入的那個數字。要求時間複雜度是o n 如果有多對數字的和等於輸入的數字,輸出任意一對即可...

兩個古老問題的遞迴演算法。

1.全排列 思路1 遞迴分治 基於交換 include void perm int a,int start,int end void swap int m,int n void output const int a,int size int main perm a,0,5 return 0 void...