一、遞迴的定義
1.什麼是遞迴:在乙個函式裡在呼叫這個函式本身
2.最大遞迴層數做了乙個限制:997,但是也可以自己限制
1 deffoo():2 print(n)3 n+=1
4 foo(n)5 foo(1)
驗證997
3.最大層數限制是python預設的,可以做修改,但是不建議你修改。(因為如果用997層遞迴都沒有解決的問題要麼是不適合使用遞迴來解決問題,要麼就是你的**太爛了)
1 importsys2 sys.setrecursionlimit(10000000)#修改遞迴層數
3 n=04 deff():5 globaln6 n+=1
7 print(n)8 f()9 f()
view code
我們可以通過以上**,匯入sys模組的方式來修改遞迴的最大深度。
4.結束遞迴的標誌:return
5.遞迴解決的問題就是通過引數,來控制每一次呼叫縮小計算的規模
6.使用場景:資料的規模在減少,但是解決問題的思路沒有改變
7.很多排序演算法會用到遞迴
二、遞迴小應用
1.下面我們來猜一下小明的年齡
小明是新來的同學,麗麗問他多少歲了。
他說:我不告訴你,但是我比滔滔大兩歲。
滔滔說:我也不告訴你,我比曉曉大兩歲
曉曉說:我也不告訴你,我比小星大兩歲
小星也沒有告訴他說:我比小華大兩歲
最後小華說,我告訴你,我今年18歲了
這個怎麼辦呢?當然,有人會說,這個很簡單啊,知道小華的,就會知道小星的,知道小星的就會知道曉曉的,以此類推,就會知道小明的年齡啦。這個過程已經非常接近遞迴的思想了。
小華18+2
小星20+2
曉曉22+2
滔滔24+2
小明26+2
上面的圖我們可以用個序號來表示吧
age(5) = age(4)+2age(4) = age(3) + 2age(3) = age(2) + 2age(2) = age(1) + 2age(1) = 18
那麼**該怎麼寫呢?
1 defage(n):2 if n == 1:3 return 18
4 else:5 return age(n - 1) + 2
7 ret=age(6)8 print(ret)
view code
2.乙個數,除2直到不能整除2
1 defcal(num):2 if num%2==0:#先判斷能不能整除
3 num=num//2
4 returncal(num)5 else:6 returnnum7 print(cal(8))
乙個數,除2直到不能整除2
3.如果乙個數可以整除2,就整除,不能整除就*3+1
1 deffunc(num):2 print(num)3 if num==1:4 return
5 if num%2==0:6 num=num//2
7 else:8 num=num*3+1
9 func(num)10 func(5)
如果乙個數可以整除2,就整除,不能整除就*3+1
三、**選單
menu = ,
'網易': {},
'google': {}
'中關村': ,
'汽車之家': {},
'youku': {},
'上地': ,
'北航': {},
'天通苑': {},
'回龍觀': {},
'朝陽': {},
'東城': {},
'上海':
'閘北':
'浦東': {},
'山東': {},
1 defthreelm(menu):2 whiletrue:3 for key in menu:#迴圈字典的key,列印出北京,上海,山東
4 print(key)5 name=input('>>>:').strip()6 if name=='back' or name=='quit':#如果輸入back,就返回上一層。如果輸入quit就退出
7 return name #返回的name的給了ret
8 if name inmenu:9 ret=threelm(menu[name])10 if ret=='quit':return 'quit'#如果返回的是quit,就直接return quit 了,就退出了
11 threelm()12 #print(threelm(menu))#print列印了就返回出quit了,threelm()沒有列印就直接退出了
**選單
四、二分查詢演算法
從這個列表中找到55的位置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 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]2 deffind(l,aim):3 mid=len(l)//2#取中間值,//長度取整(取出來的是索引)
4 if l[mid]>aim:#判斷中間值和要找的那個值的大小關係
5 new_l=l[:mid]#顧頭不顧尾
6 return find(new_l,aim)#遞迴演算法中在每次函式呼叫的時候在前面加return
7 elif l[mid]<8 new_l="l[mid+1:]9" returnfind else:11 returnl print>
簡單的二分法
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]2 def func(l, aim,start = 0,end = len(l)-1):3 mid = (start+end)//2#求中間的數
4 if not l[start:end+1]:#如果你要找的數不在裡面,就return'你查詢的數字不在這個列表裡面'
5 return '你查詢的數字不在這個列表裡面'
6 elif aim >l[mid]:7 return func(l,aim,mid+1,end)8 elif aim
14 index = func(l,55)15 print(index)16 #print(func(l,41))
公升級版二分法
8>
python靜態遞迴函式 python 遞迴函式
前言 本篇關於遞迴基本借鑑下面部落格講解加入自己理解。1.遞迴函式定義 如果乙個函式在函式內部呼叫自己,那這個函式就是遞迴函式。如 defsum arg,stop print arg if arg arg arg sum arg,stop sum 1,20 2.遞迴的特性 1 必須有乙個明確的結束條...
python遞迴函式例項 python遞迴函式
python遞迴函式 什麼是遞迴?遞迴,就是在函式執行中自己呼叫自己 示例 def recursion n 定義遞迴函式 print n 列印n recursion n 1 在函式的執行種呼叫遞迴 recursion 1 呼叫函式 這個函式在不斷的自己呼叫自己,每次呼叫n 1,看下執行結果 998t...
PYTHON 遞迴函式
如果乙個函式體直接或者間接呼叫自己,那麼這個函式就稱為遞迴函式 也就是說,遞迴函式體的執行過程中可能會返回去再次呼叫該函式 在 裡,遞迴函式不需要任何特殊的語法,但是它需要付出一定的努力去理解和建立 我們會以乙個簡單的例子開始 寫乙個函式求乙個自然數中所有數字的和 在設計遞迴函式的時候,我們會尋找能...