1. 初識遞歸
什么是遞歸:在函數(shù)中調用自身函數(shù)
最大遞歸深度默認是997/998 —— 是python從內存角度出發(fā)做得限制
遞歸演示范例:
def story():
print("從前有座山")
story()
story()
1.1 遞歸報錯信息
RecursionError: maximum recursion depth exceeded while calling a Python object
上句是遞歸的錯誤,超過了遞歸的最大深度
1.2 破除默認深度997
但能跑多少次,看每臺電腦的內存大小。
import sys
sys.setrecursionlimit(1000000)
n = 0
def story():
global n
n += 1
print(n)
story()
story()
1.3 遞歸結論
如果遞歸次數(shù)太多,就不適合使用遞歸來解決問題
遞歸的缺點 : 占內存
遞歸的優(yōu)點: 會讓代碼變簡單
1.4 遞歸例子
題目:
alex 多大 n = 1 age(1) = age(2)+2 = age(n+1) + 2
alex比egon大兩歲
egon多大? n = 2 age(2) = age(3) + 2 = age(n+1) +2
egon比wusir大兩歲
wusir多大 n = 3 age(3) = age(4) + 2 = age(n+1) +2
wusir比金老板大兩歲
金老板多大?
金老板40了 n = 4 age(4) = 40
n = 4 age(4) = 40
n <4 age(n) = age(n+1) +2
范例:
計算年齡
def age(n):
if n == 4:
return 40
elif n >0 and n < 4:
return age(n+1) + 2
print(age(1))
執(zhí)行結果:
46
如何看遞歸:
# def age(1):
# if 1 == 4:
# return 40
# elif 1 > 0 and 1 < 4:
# return 46
#
# def age(2):
# if 2 == 4:
# return 40
# elif 2 >0 and 2 < 4:
# age(3) + 2 None +2
#
# def age(3):
# if 3 == 4:
# return 40
# elif 3 >0 and 3 < 4:
# 42
#
# def age(4):
# if 4 == 4:
# return 40
# elif n >0 and n < 4:
# age(n+1) + 2
2. 初識算法
什么叫算法
計算的方法 : 人腦復雜 計算機簡單
99 * 13 = 1287 = 13*100 - 13
查找 : 找數(shù)據(jù)
排序 :
最短路徑
我們學習的算法 都是過去時
了解基礎的算法 才能創(chuàng)造出更好的算法
不是所有的事情都能套用現(xiàn)成的方法解決的
有些時候會用到學過的算法知識來解決新的問題
二分查找算法 必須處理有序的列表
l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
范例1.1:
有問題的代碼---是因為每次都會換索引
l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
def find(l,aim):
mid_index = len(l) // 2
if l[mid_index] < aim:
new_l = l[mid_index+1 :]
find(new_l,aim)
elif l[mid_index] > aim:
new_l = l[:mid_index]
find(new_l, aim)
else:
print('找到了',mid_index,l[mid_index])
find(l,66)
執(zhí)行結果:
找到了 0 66
范例1.2:
代碼完善
l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
def find(l,aim,start = 0,end = None):
end = len(l) if end is None else end
mid_index = (end - start)//2 + start
if start <= end:
if l[mid_index] < aim:
return find(l,aim,start =mid_index+1,end=end)
elif l[mid_index] > aim:
return find(l, aim, start=start, end=mid_index-1)
else:
return mid_index,aim
else:
return '找不到這個值'
ret= find(l,44) # 找不到
print(ret)
ret= find(l,66) # 發(fā)生好幾次
print(ret)
ret= find(l,67) # 發(fā)生兩次調用
print(ret)
執(zhí)行結果:
找不到這個值
(17, 66)
(18, 67)
3. 總結
超過最大遞歸限制的報錯
只要寫遞歸函數(shù),必須要有結束條件。
返回值
不要只看到return就認為已經返回了。要看返回操作是在遞歸到第幾層的時候發(fā)生的,然后返回給了誰。
如果不是返回給最外層函數(shù),調用者就接收不到。
需要再分析,看如何把結果返回回來。