目錄 :
一、遞迴的簡介
二、遞迴的經典應用
2.1 遞迴求階乘
2.2 遞迴推斐波那契數列
2.3 二分法找有序列表指定值
2.4 遞迴解漢諾塔
前言:當我們碰到諸如需要求階乘或斐波那契數列的問題時,使用普通的迴圈往往比較麻煩,但如果我們使用遞迴時,會簡單許多,起到事半功倍的效果。這篇文章主要和大家分享一些和遞迴有關的經典案例,結合一些資料談一下個人的理解,也藉此加深自己對遞迴的理解和掌握一些遞迴基礎的用法。
一、遞迴的簡介
程式呼叫自身的程式設計技巧稱為遞迴( recursion)。
遞迴做為一種演算法在程式語言中廣泛應用。 乙個過程或函式在其定義或說明中有直接或
間接呼叫自身的一種方法,它通常把乙個大型複雜的問題層層轉化為乙個與原問題相似的規模較小的問題
來求解,遞迴策略只需少量的程式就可描述出解題過程所需要的多次重複計算,大大地減少了程式的**量。
遞迴的能力在於用有限的語句來定義物件的無限集合。一般來說,遞迴需要有邊界條件、遞迴前進
段和遞迴返回段。當邊界條件不滿足時,遞迴前進;當邊界條件滿足時,遞迴返回。
2、遞迴的通俗理解
遞迴就是在函式內部呼叫自己的函式被稱之為遞迴。
3、幾個關於遞迴通俗的比喻
1、我們使用的詞典,本身就是遞迴,為了解釋乙個詞,需要使用更多的詞。當你查乙個詞,發現這個詞的解釋中某個詞仍然不懂,於是你開始查這第二個詞,可惜,第二個詞裡仍然有不懂的詞,於是查第三個詞,這樣查下去,直到有乙個詞的解釋是你完全能看懂的,那麼遞迴走到了盡頭,然後你開始後退,逐個明白之前查過的每乙個詞,最終,你明白了最開始那個詞的意思。
2、乙個小朋友坐在第10排,他的作業本被小組長扔到了第1排,小朋友要拿回他的作業本,可以怎麼辦?他可以拍拍第9排小朋友,說:「幫我拿第1排的本子」,而第9排的小朋友可以拍拍第8排小朋友,說:「幫我拿第1排的本子」...如此下去,訊息終於傳到了第1排小朋友那裡,於是他把本子遞給第2排,第2排又遞給第3排...終於,本子到手啦!這就是遞迴,拍拍小朋友的背可以模擬函式呼叫,而小朋友們都記得要傳訊息、送本子,是因為他們有記憶力,這可以模擬棧。
3、 乙個洋蔥是乙個帶著一層洋蔥皮的洋蔥。
4、最簡單的遞迴的例項
#-*- coding:utf-8-*-#將 10不斷除以2,直至商為0,輸出這個過程中每次得到的商的值。
defrecursion(n):
v= n//2 #地板除,保留整數
print(v) #每次求商,輸出商的值
if v==0:'''當商為0時,停止,返回done'''
return 'done'v= recursion(v) #遞迴呼叫,函式內自己呼叫自己
recursion(10) #函式呼叫
輸出結果:
5、遞迴的特點
通過以上的介紹,我們大致可以總結出遞迴的以下幾個特點:
1、必須有乙個明確的結束條件2、每次進入更深一層遞迴時,問題規模(計算量)相比上次遞迴都應有所減少3、遞迴效率不高,遞迴層次過多會導致棧溢位(在計算機中,函式呼叫是通過棧(stack)這種資料結構實現的,每當進入乙個函式呼叫,棧就會加一層棧幀,每當函式返回,棧就會減一層棧幀。由於棧的大小不是無限的,所以,遞迴呼叫的次數過多,會導致棧溢位)
關於遞迴還有兩個名詞,可以概括遞迴實現的過程
回溯:則是在遇到終止條件,則從最後往回返一級一級的把值返回來,這叫回溯
二、遞迴經典案例
1、遞迴求階乘
例項如下:
#1!+2!+3!+4!+5!+...+n!
deffactorial(n):'''n表示要求的數的階乘'''
if n==1:return n #階乘為1的時候,結果為1,返回結果並退出
n = n*factorial(n-1) #n! = n*(n-1)!
return n #返回結果並退出
res = factorial(5) #呼叫函式,並將返回的結果賦給res
print(res) #列印結果
2、遞迴推斐波那契數列
例項如下:
#1,1,2,3,5,8,13,21,34,55,試判斷數列第十五個數是哪個?
deffabonacci(n):'''n為斐波那契數列'''
if n <= 2:'''數列前兩個數都是1'''v= 1
return v #返回結果,並結束函式
v = fabonacci(n-1)+fabonacci(n-2) #由資料的規律可知,第三個數的結果都是前兩個數之和,所以進行遞迴疊加
return v #返回結果,並結束函式
print(fabonacci(15)) #610 呼叫函式並列印結果
3、二分法找有序列表指定值
例項如下:
data = [1,3,6,13,56,123,345,1024,3223,6688]defdichotomy(min,max,d,n):'''min表示有序列表頭部索引
max表示有序列表尾部索引
d表示有序列表
n表示需要尋找的元素'''mid= (min+max)//2
if mid==0:return 'none'
elif d[mid]n:print('向左側找!')returndichotomy(min,mid,d,n)else:print('找到了%s'%d[mid])returnres= dichotomy(0,len(data),data,222)print(res)
未完待續。。。
python3經典例題 經典例題 Python
python python開發 python語言 經典例題 python 經典例題 if巢狀 1.使用者輸入賬號 2.使用者輸入密碼 3.判斷使用者的賬號是不是alex 4.如果賬號是alex在繼續判斷密碼是不是alexdsb 5.賬號和密碼都正確提示使用者alex就是乙個dsb 6.如果賬號正確密...
Python經典案例 身體指數BMI
相信大家都知道bmi 即 bmi 體重 kg 身高2 m2 對於這個問題,我們要做到 calbmiv1.py height,weight eval input 請輸入身高 公尺 和體重 公斤 逗號隔開 bmi weight pow height,2 print bmi 數值為 format bmi ...
mysql經典案例
使用sql語句建立資料庫,名稱為customdb 答 create database if not exists customdb 建立資料表customer 客戶 deposite 存款 bank 銀行 表結構如下 建立表,如下 答 建立顧客表 create table ifnot exists ...