有過編程學習經(jīng)驗的人對于遞歸函數(shù)一定不陌生,我們經(jīng)常使用遞歸的方式來解決一系列復(fù)雜的問題,遞歸算法對于大多數(shù)問題都是很有效的,而且它也可以優(yōu)化我們的代碼,我們在使用遞歸的時候有幾點需要注意:
1) 遞歸是在函數(shù)本身調(diào)用函數(shù)本身。
2) 遞歸的效率比較低,如果有時間限制不建議使用。
3) 遞歸過程中需要有一個明確的結(jié)束條件,即遞歸出口。
下面我們就來詳細的講解一下遞歸函數(shù)。
1. 遞歸函數(shù)
我們先通過例子來看一下遞歸的簡單使用:
m = int(input('輸入一個數(shù)字:')) def test(x): x += 2 if x <100: test(x) else: print('最后的x為:',x) test(m)
輸出結(jié)果為:
輸入一個數(shù)字:20 最后的x為: 100
我們來分析一下這個例子,首先第一行代碼我們輸入了一個整數(shù),最后一行把m作為實際參數(shù)傳遞到test()方法,在test()方法中,會先把x進行加2處理,然后進行一個判斷,如果x的值小于100,那么就再次調(diào)用這個函數(shù),調(diào)用的時候當前x的值作為實際參數(shù)參加調(diào)用,直到滿足x>=100的時候結(jié)束遞歸。
看下面示意圖:
即如果不滿足條件就回到了最外層來調(diào)用了這個函數(shù)。
2. 斐波那契數(shù)列
談起遞歸算法中經(jīng)典的問題,總是離不開斐波那契數(shù)列和漢諾塔,我們在這里來講解一下如果使用遞歸去求解斐波那契數(shù)列。
首先我們要知道斐波那契數(shù)列的遞推公式為F(n)=F(n-1)+F(n-2),F(xiàn)(1)、和F(2)為1,我們可以通過遞歸來求解斐波那契數(shù)列中的某一項的值為多少。
求解斐波那契數(shù)列問題的時候我們可以采用多種方式。
首先我們使用常用的遞歸方式來解決這個問題:
N = int(input("輸入需要得到的項數(shù):")) def fibonacci(n): if n <= 2:#如果小于等于2就把n置1 return 1 else: return fibonacci(n-1) + fibonacci(n-2) print('對應(yīng)值為',fibonacci(n))
輸出結(jié)果為:
輸入需要得到的項數(shù):4 對應(yīng)值為 3
對于這種遞歸的調(diào)用方式,當我們輸入的值4的時候,會在遞歸中執(zhí)行下面的操作:
fibonacci(3)+fibonacci(2)=fibonacci(2)+fibonacci(1)+fibonacci(2)
然后我們可以看出第四項的值為1+1+1=3。
其實這種方式的求解是比較浪費時間的,因為需要進行迭代的次數(shù)太多,我們還可以采用空間替代時間的方式來求解這個問題。
代碼如下:
n = int(input("輸入需要得到的項數(shù):")) fibonacci = [1,1] for i in range(2,n): fibonacci.append(fibonacci[i-1] + fibonacci[i-2]) print('對應(yīng)值為',fibonacci[n-1])
輸出結(jié)果為:
輸入需要得到的項數(shù):4 對應(yīng)值為 3
這種方式我們首先給列表規(guī)定了前2項的值,然后對于我們要求解的項數(shù)n,我們直接通過公式把這個斐波那契數(shù)列的列表填充到我們需要的那一項,最后根據(jù)索引值直接找到對應(yīng)項輸出結(jié)果。
3. 總結(jié)
關(guān)于遞歸函數(shù)就講到這里,上面所講到需要注意的幾點大家要尤為注意遞歸出口和時間限制,出口是遞歸結(jié)束的關(guān)鍵,在很多時候,我們使用遞歸的方法會導(dǎo)致程序超出規(guī)定的時間,這時候我們就需要更換思路來求解問題,上面講的第二種方式可以幫助大家解決問題。
1004 | [遞歸]母牛的故事 |
1444 | 藍橋杯2014年第五屆真題-斐波那契 |
1463 | 藍橋杯基礎(chǔ)練習VIP-Sine之舞 |
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習題和答疑,點擊了解:
一點編程也不會寫的:零基礎(chǔ)C語言學練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進階課程
從零到寫出一個爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程
信息學奧賽或C++選手的 必學C++課程
藍橋杯ACM、信息學奧賽的必學課程:算法競賽課入門課程
手把手講解近五年真題的藍橋杯輔導(dǎo)課程