第一要素:明確你這個函式想要幹什麼
對於遞迴,我覺得很重要的乙個事就是,這個函式的功能是什麼,他要完成什麼樣的一件事,而這個,是完全由你自己來定義的。也就是說,我們先不管函式裡面的**什麼,而是要先明白,你這個函式是要用來幹什麼。
例如,我定義了乙個函式
// 算 n 的階乘(假設n不為0)
int f
(int n)
這個函式的功能是算 n 的階乘。好了,我們已經定義了乙個函式,並且定義了它的功能是什麼,接下來我們看第二要素。
第二要素:尋找遞迴結束條件
所謂遞迴,就是會在函式內部**中,呼叫這個函式本身,所以,我們必須要找出遞迴的結束條件,不然的話,會一直呼叫自己,進入無底洞。也就是說,我們需要找出當引數為啥時,遞迴結束,之後直接把結果返回,請注意,這個時候我們必須能根據這個引數的值,能夠直接知道函式的結果是什麼。
例如,上面那個例子,當 n = 1 時,那你應該能夠直接知道 f(n) 是啥吧?此時,f(1) = 1。
完善我們函式內部的**,把第二要素加進**裡面,如下
// 算 n 的階乘(假設n不為0)
int f
(int n)
}
第三要素:找出函式的等價關係式
第三要素就是,我們要不斷縮小引數的範圍,縮小之後,我們可以通過一些輔助的變數或者操作,使原函式的結果不變。
例如,f(n) 這個範圍比較大,我們可以讓 f(n) = n * f(n-1)。這樣,範圍就由 n 變成了 n-1 了,範圍變小了,並且為了原函式f(n) 不變,我們需要讓 f(n-1) 乘以 n。
說白了,就是要找到原函式的乙個等價關係式,f(n) 的等價關係式為 n * f(n-1),即f(n) = n * f(n-1)。
找出了這個等價,繼續完善我們的**,我們把這個等價式寫進函式裡。如下:
// 算 n 的階乘(假設n不為0)
int f
(int n)
// 把 f(n) 的等價操作寫進去
return
f(n-1)
* n;
}
至此,遞迴三要素已經都寫進**裡了,所以這個 f(n) 功能的內部**我們已經寫好了。
這就是遞迴最重要的三要素,每次做遞迴的時候,你就強迫自己試著去尋找這三個要素。
遞迴的理解
對於遞迴問題,一定要明確的一點是,初始呼叫該函式時的輸入是什麼樣的 遞迴能夠奏效的前提是,問題的規模一定是減少的,或者更為嚴謹地說,問題一定是朝著遞迴結束的條件執行的 遞迴函式的第乙個要執行的就是 if 判斷,也即每進入一次遞迴,都要首先判斷是否到達遞迴的結束,n 0 其次還要明晰遞迴函式的功能,是...
遞迴的理解
本篇文章只要是實現最大公倍數的遞迴實現方法。最大公倍數是指兩個數能夠被一組數同時整除,其中最大的那個數就叫做最大公倍數,求解最大公倍數這裡主要說兩個想法,其實就是將複雜的問題簡化逐步簡化到乙個很小的問題,然後求得答案。假設有兩個數 252和105 252 21 12 105 21 5 252 105...
遞迴的理解
先考慮第一步,在考慮第二步,第二步可能與第一部的解法思路相同,範圍卻小了 然後一直分解。直到邊界有返回值 特例 下面是個關於遞迴呼叫簡單但是很能說明問題的例子 cpp view plain copy 遞迴例子 include void up and down int int main void vo...