递归函数
Posted gkx0731
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归函数相关的知识,希望对你有一定的参考价值。
递归函数:函数本身自己调用自己,最大的调用层数为998(可以import sys模块 sys.setrecursionlimit(1000000) 增加调用层数)所以需要设置一个明确的断点;
递归函数的理解:看递归函数的时候,最简单的方法,就是抽丝剥茧,一层函数一层函数的来看,比如下面例子中 斐波那契数列思路二;
递归的使用:递归比较少用得到,基本上日常用到的递归,都可以用循环解决。
实例:
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],‘ ‘) 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],‘ ‘) return find(l,aim,start=start,end=mid_index-1) else: print(l[mid_index],‘ ‘) 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))
以上是关于递归函数的主要内容,如果未能解决你的问题,请参考以下文章