1. 程式人生 > >python開發函數進階:遞歸函數

python開發函數進階:遞歸函數

bre for 自己 lis 一次 技術 結束 函數 ont

一,什麽叫遞歸

#遞歸
#在一個函數裏調用自己
#python遞歸最大層數限制 997
#最大層數限制是python默認的,可以做修改
#但是我們不建議你修改

例子和尚講故事

 1 #!/usr/bin/env python
 2 #_*_coding:utf-8_*_
 3 
 4 #:基礎版本
 5 def story():
 6     print("從前有座山,山裏有座廟,廟裏有個老和尚講故事,講的什麽呀?")
 7 while True:
 8     story()
 9 
10 #:遞歸版本
11 def story():
12     #遞歸函數,在一個函數內調用自己
13     #最大遞歸層數做了一個限制:997
14 print("從前有座山,山裏有座廟,廟裏有個老和尚講故事,講的什麽呀?") 15 story() 16 print(123) 17 story()

修改深度

 1 #!/usr/bin/env python
 2 #_*_coding:utf-8_*_
 3 
 4 import sys #所有和python相關的設置和方法
 5 sys.setrecursionlimit(10000000)
 6 n = 0
 7 def f():
 8     global n
 9     n += 1
10     print(n)
11     f()
12 f()

二,遞歸實例

遞歸實現三級菜單

技術分享
 1 #!/usr/bin/env python
 2 #_*_coding:utf-8_*_
 3 
 4 #三級菜單,按B返回
 5 menu = {
 6     北京: {
 7         海澱: {
 8             五道口: {
 9                 soho: {},
10                 網易: {},
11                 google: {}
12             },
13             中關村: {
14                 愛奇藝
: {}, 15 汽車之家: {}, 16 youku: {}, 17 }, 18 上地: { 19 百度: {}, 20 }, 21 }, 22 昌平: { 23 沙河: { 24 老男孩: {}, 25 北航: {}, 26 }, 27 天通苑: {}, 28 回龍觀: {}, 29 }, 30 朝陽: {}, 31 東城: {}, 32 }, 33 上海: { 34 閔行: { 35 "人民廣場": { 36 炸雞店: {} 37 } 38 }, 39 閘北: { 40 火車戰: { 41 攜程: {} 42 } 43 }, 44 浦東: {}, 45 }, 46 山東: {}, 47 } 48 print(主菜單.center(40,=)) 49 # while True: 50 # for i in menu:print(i) 51 # user1 = input(‘no 1>>>:‘) 52 # if user1 == ‘b‘:break 53 # if user1 == ‘q‘:exit() 54 # if user1 not in menu:continue 55 # if user1 in menu: 56 # while True: 57 # for i1 in menu[user1]: print(i1) 58 # user2 = input(‘no 2>>>:‘) 59 # if user2 == ‘b‘: break 60 # if user2 == ‘q‘: exit() 61 # if user2 not in menu[user1]: continue 62 # if user2 in menu[user1]: 63 # while True: 64 # for i2 in menu[user1][user2]: print(i2) 65 # user3 = input(‘no 3>>>:‘) 66 # if user3 == ‘b‘: break 67 # if user3 == ‘q‘: exit() 68 # if user3 not in menu[user1][user2]: continue 69 # if user3 in menu[user1][user2]: 70 # while True: 71 # user4 = input(‘no 4>>>:‘) 72 # if user4 == ‘b‘:break 73 # if user4 == ‘q‘:exit() 74 75 def list(menu): #menu being 76 while True: 77 for i in menu: 78 print(i) 79 k = input(>>>).strip()##beijng 80 if k == b or k ==q: #k 81 return k #diyi beijing 82 if k in menu: 83 ret = list(menu[k]) #menu shahe 84 if ret == q:return q 85 index = list(menu) 86 print(index)
View Code

遞歸實現二分查找

技術分享
 1 #!/usr/bin/env python
 2 #_*_coding:utf-8_*_
 3 
 4 #二分查找算法
 5 #算法:計算的方法
 6 #有序的遞增列表
 7 #查找的是數字
 8 l = [2,3,5,10,15,16,18,22,26]
 9 def find(l,aim): #l:列表 aim:要找的
10     mid = len(l)//2  #計算中點
11     if l[mid] > aim: #判斷中間位置的值和目標值的大小關系
12         new_l = l[:mid] #[16,18] = [16,18,22,26][:mid]
13         return find(new_l,aim)
14     elif l[mid] < aim:#判斷中間位置的值和目標值的大小關系
15         new_l = l[mid+1:]
16         return find(new_l,aim)
17     else:
18         return l[mid]
19 print(find(l,16))
20 
21 #升級版二分法
22 #查找的是索引
23 l = [2,3,5,10,15,16,18,22,26]
24 def find2(l,aim,start,end):#[2,3,5,10,15,16,18,22,26]  0,8
25     mid = (end+start)//2  #4   #5+8/2=6  #start =5 end = 5 mid = 5
26     if start <  end:
27         if l[mid] > aim:  #15  17  #18 17
28             end = mid -1  #end =6-1 = 5
29             return find2(l,aim,start,end)
30         elif l[mid] < aim: #15  17
31             start = mid + 1  # start = 5
32             return find2(l, aim, start, end)
33         else:
34             return mid
35     else:
36         return "找不到"
37 print(find2(l,18,start=0,end = len(l)-1))
38 
39 #高級版二分法
40 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]
41 def func(l, aim,start = 0,end = len(l)-1 ):
42     mid = (start+end)//2
43     print(l[start:end+1])
44     if not l[start:end+1]:      #空就是False not 就是 true
45         return
46     elif aim > l[mid]:
47         return func(l,aim,mid+1,end)
48     elif aim < l[mid]:
49         return func(l,aim,start,mid-1)
50     elif aim == l[mid]:
51         print("bingo")
52         return mid
53 index = func(l,1)
View Code

三,總結

#遞歸解決的問題
#就是通過參數,來控制每一次調用縮小計算的規模
#適合的場景
#數據的規模在減小,但是解決問題的思路沒有改變
#結束遞歸的標誌:return

python開發函數進階:遞歸函數