遞歸函數:函數自己本身調用本身,最大的調用層數爲998(能夠import sys模塊 sys.setrecursionlimit(1000000) 增長調用層數)因此須要設置一個明確的斷點;python
遞歸函數的理解:看遞歸函數的時候,最簡單的方法,就是抽絲剝繭,一層函數一層函數的來看,好比下面例子中 斐波那契數列思路二;app
遞歸的使用:遞歸比較少用獲得,基本上平常用到的遞歸,均可以用循環解決。ide
實例:函數
import sys sys.setrecursionlimit(1000000) n = 0 def story(): global n n +=1 print(n) story() story()
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)-1 if end == None else end #find(l,99,start=14,end = 26) print('end>>>>',end) mid_index = (end-start)//2 + start #中間值 24 print('start>>>>', start) print('mid_index>>>>',mid_index) if start <= end: if l[mid_index] < aim : # 比較 88 和 99 print(l[mid_index],'\n') return find(l,aim,start=mid_index+1,end=end) #find(l,99,start=25,end = 25) elif l[mid_index] > aim : print(l[mid_index],'\n') return find(l,aim,start=start,end=mid_index-1) else: print(l[mid_index],'\n') return mid_index #注意此處return是要返回給上一級函數的,不能在此處加多餘字符串 else: return '找不到' print(find(l,88))
#兩種思路 #1,用雙遞歸,比較佔用運行空間,不過簡單易懂: def fibo(n): if n == 1 or n == 2: return 1 else: return fibo(n-1) + fibo(n-2) print(fibo(10)) #2,用單遞歸,效率快,不過比較繞 def fibo2(n,l=[0]): l[0] += 1 if n == 1 or n == 2: l[0] -= 1 if l[0] == 0: return 1 return 1,1 else: a,b =fibo2(n-1) l[0] -= 1 if l[0] == 0 : return a+b return b,a+b print(fibo2(100))
#以fibo2(4)爲例進行分析 # def fibo2(4,l=[0]): #獲得返回值4 # l[0] += 1 #1 # if n == 1 or n == 2: # l[0] -= 1 # if l[0] == 0: # return 1 # return 1,1 # else: # a,b =fibo2(3) # a,b = fibo2(3) # l[0] -= 1 # if l[0] == 0 : # return a+b # return b,a+b # # # def fibo2(3,l=[0]): # l[0] += 1 # 2 # if n == 1 or n == 2: # l[0] -= 1 # if l[0] == 0: # return 1 # return 1,1 # else: # a,b =fibo2(n-1) # a,b = fibo2(2) #1,2 返回回來 往下執行 # l[0] -= 1 # 0 # if l[0] == 0 : # return a+b #3 返回1+2,給fibo2(4) # return b,a+b # # def fibo2(2,l=[0]): # l[0] += 1 # 3 # if n == 1 or n == 2: # l[0] -= 1 #2 此處l[0]由於 n==2要減1 # if l[0] == 0: # return 1 # return 1,1 # else: # a,b =fibo2(n-1) # a,b = fibo2(2) # 1,1返回給 a,b,而後往下執行 # l[0] -= 1 # 1 此處繼續減1,l[0]變爲1 # if l[0] == 0 : # return a+b # return b,a+b # 1,2 #返回給 b,a+b 這個再繼續返回給fibo2(3) # print(fibo2(4))
#!/usr/bin/env python #-*-coding=utf-8 -*- #GKX menu = { '北京': { '海淀': { '五道口': { 'soho': {}, '網易': {}, 'google': {} }, '中關村': { '愛奇藝': {}, '汽車之家': {}, 'youku': {}, }, '上地': { '百度': {}, }, }, '昌平': { '沙河': { '老男孩': {}, '北航': {}, }, '天通苑': {}, '回龍觀': {}, }, '朝陽': {}, '東城': {}, }, '上海': { '閔行': { "人民廣場": { '炸雞店': {} } }, '閘北': { '火車戰': { '攜程': {} } }, '浦東': {}, }, '山東': {}, } #堆棧的思想 # l = [menu] # while l: # for key in l[-1]: # print(key) # k = input('input>>').strip() # 北京 # if k in l[-1].keys() and l[-1][k]:l.append(l[-1][k]) # elif k == 'b': # l.pop() # elif k == 'q': # break #遞歸的思想 def three_level_menu(menu): while True: for key in menu: print(key) k=input('>>>') if k=='q':return 'q' elif k=='b':break elif k in menu: ret=three_level_menu(menu[k]) if ret=='q':return 'q' three_level_menu(menu)
#階乘 def fac(n): if n == 1: return 1 else: return n*fac(n-1) print(fac(10))