標籤:學習 app ... 遞迴 字串 pen 一個 資源 利用
1、遞迴函式
1.1、遞迴函式的限制
(1)遞迴一定要有允出準則,並且遞迴調用一定要執行到這個允出準則;如果沒有允出準則,就是無限調用,會耗盡所有資源(棧空間);
(2)遞迴調用的深度不易過深,Python對遞迴調用的深度做了限制,以保護解譯器;
1.2、遞迴執行個體
①、遞迴實現菲薄拉切數列
# version1:數學公式版本def fib(n): return 1 if n<3 else fib(n-1)+fib(n-2)print(fib(10))分析:此版本雖然看著簡潔明了,但是會有很大的效率問題,當n操作35以後計算結果就非常慢# version2:利用上一次結果def fib(n,a=0,b=1): # n=3 if n<3: return a+b else: a,b=b,a+b # 0,1=1,1 return fib(n-1,a,b)分析:版本每次都利用了上一次運算的結果,所以效率相對於第一個版本來說,快了不少;# for迴圈實現a,b=0,1for i in range(10): a,b=b,a+b print(a)分析:版本二就是根據for迴圈演變而來
②、遞迴實現階乘
def fac(n,sum=1): if n==1: return 1 return n*fac(n-1)def fac(n,sum=1): sum=sum*n if n<2: return sum return fac(n-1,sum)# 版本二將每次計算的結果帶入了下一次計算
③、將一個數逆序放入列表
nums=‘1234‘print(nums[len(nums)-1])l=[]for i in range(len(nums)-1,-1,-1): l.append(nums[i])print(l)
# for迴圈實現
def revert(x): if x == -1: return [] return [nums[x]] + revert(x-1)print(revert(len(nums)-1))
# 列表拼接實現def revert(x,target=[]): if x: target.append(x[-1]) revert(x[:-1]) return targetprint(revert(nums))
# 字串切片實
④、遞迴解決猴子吃桃問題
‘‘‘xd1=x//2-1d2=d1//2-1d3=d2//2-1......d9=d8//2-1 ==> 2(d9+1)=d8=d7/2-1‘‘‘peach=1for i in range(9): peach=2*(peach+1)print(peach)‘‘‘這題得倒著推。第10天還沒吃,就剩1個,說明第9天吃完一半再吃1個還剩1個,假設第9天還沒吃之前有桃子p個,可得:p * 1/2 - 1 = 1,可得 p = 4。以此類推,即可手算出。代碼思路為:第10天還沒吃之前的桃子數量初始化 p = 1,之後從9至1迴圈9次,根據上述公式反推為 p = (p+1) * 2 可得第1天還沒吃之前的桃子數量。
for迴圈中的print()語句是為了驗證推算過程而增加的。代碼如下:p = 1print(‘第10天吃之前就剩1個桃子‘)for i in range(9, 0, -1): p = (p+1) * 2 print(‘第%s天吃之前還有%s個桃子‘ % (i, p))print(‘第1天共摘了%s個桃子‘ % p)‘‘‘# 遞迴實現def peach(n=10): if n == 1: return 1 return (peach(n-1)+1)*2print(peach())
2、匿名函數3、產生器4、插入排序
python學習week5-遞迴,匿名函數、產生器