在高階語言中,函式自己呼叫和呼叫其他函式並沒有本質的不同。
我們把乙個直接呼叫自己或通過一系列的呼叫語句間接地呼叫自己的函式,稱作遞迴函式。
不過,寫遞迴程式最怕的就是陷入永不結束的無窮遞迴中。切記,每個遞迴定義必須至少有乙個條件,當滿足這個條件時遞迴不再進行,即函式不再呼叫自身而是返回值。
比如之前我們的fbi函式結束條件是:i < 2。
對比了兩種實現斐波那契的**,迭代和遞迴的區別是:迭代使用的是迴圈結構,遞迴使用的是選擇結構。
使用遞迴能使程式的結構更清晰、更簡潔、更容易讓人理解,從而減少讀懂**的時間。
但大量的遞迴呼叫會建立函式的副本,會消耗大量的時間和記憶體,而迭代則不需要此種付出。
遞迴函式分為呼叫和回退階段,遞迴的回退順序是它呼叫順序的逆序。
舉個例子,計算n的階乘n!
n的階乘
這樣我們就不難設計出遞迴演算法:
int factorial( n )
假設我們n的值傳入是5,那麼:
題目要求:編寫乙個遞迴函式,實現將輸入的任意長度的字串反向輸出的功能。
例如輸入字串fishc,則輸出字串chsif。
應用遞迴的思想有時可以很輕鬆地實現一些看似不太容易實現的功能,例如這道題。
要將乙個字串反向地輸出,童鞋們一般採用的方法是將該字串存放到乙個陣列中,然後將陣列元素反向的輸出即可。
這道題要求輸入是任意長度,所以不用遞迴的話,實現起來會比較麻煩(當然你可以用之前我們講過的動態申請記憶體那招)。
我們說過,遞迴它需要有乙個結束的條件,那麼我們可以將「#」作為乙個輸入結束的條件。
void print()
假設我們從螢幕上輸入字串:abc#
分而治之的思想古已有之,秦滅六國,統一天下正是採取各個擊破、分而治之的原則。
而分治思想在演算法設計中也是非常常見的,當乙個問題規模較大且不易求解的時候,就可以考慮將問題分成幾個小的模組,逐一解決。
分治思想和遞迴算是有親兄弟的關係了,因為採用分治思想處理問題,其各個小模組通常具有與大問題相同的結構,這種特性也使遞迴技術有了用武之地。
我們接下來通過例項來講解。
遞迴和分治
分治 divide and conquer 是基於多分枝遞迴的一種演算法。簡單的說就是把乙個大問題分解為多個型別相同的子問題,最後把這些子問題的解合併起來就是問題的解。我們看一下典型的遞迴和分治演算法。問題1 插入排序的遞迴演算法 思路 1.首先找到突破點 如果共有n個數,如果前面n 1個都已排序,...
遞迴和分治策略
1.遞迴的概念 直接或間接地呼叫自身的演算法稱為遞迴演算法。用函式自身給出定義的函式稱為遞迴函式。在計算機演算法設計與分析中,使用遞迴技術往往使函式的定義和演算法的描述簡潔且易於理解。對於大運算來說由於過程太多效率很低,且開銷大,常用遞推代替 編寫乙個遞迴函式,將10進製轉化成radix進製 輸出二...
遞迴和分治策略
直接或間接地呼叫自身的演算法稱為遞迴演算法。用函式自身給出定義的函式稱為遞迴函式。在計算機演算法設計與分析中,使用遞迴技術往往使函式的定義和演算法的描述簡潔且易於理解。對於大運算來說由於過程太多效率很低,且開銷大,常用遞推代替 編寫乙個遞迴函式,將10進製轉化成radix進製 輸出二進位制形式 in...