(六)函数----(九)
目录
6.1递归
递归:a.在函数中自己调用自己
b.把大规模问题化解为小规模的同样问题
c.必须有一个明确的递归结束条件,称为递归出口
递归的使用:如果递归次数太多,就不适合使用递归来解决问题
递归的缺点 : 占内存
递归的优点: 会让复杂的问题变的简单,简化代码
递归的最大深度求解:996
def foo(n):
print(n)
n += 1
foo(n)
foo(1)
修改最大递归深度:
import sys
sys.setrecursionlimit(1000000)
6.2例子
a.斐波那契 (1,1,2,3,5.....)
def fib(n):
if n == 1 or n==2:
return 1
return fib(n-1) + fib(n-2)
print(fib(50))
#优化代码
def fib(n,l = [0]):
l[0] +=1
if n ==1 or n == 2:
l[0] -= 1
return 1,1
else:
a,b = (n-1)
l[0] -= 1
if l[0] == 0:
return a+b
return b,a+b
print(fib(50))
b.二分查找算法
l = [1,2,3,4,5,6,7,8,9]
def find(l,aim,start = 0,end = None): #注意end的初值
end = len(l) if end is None else end #第一次调用函数,end = None
mid = (end - start)//2 + start #中间值 注意需要+strat 否则序号有问题
if start <= end:
if l[mid] < aim:
return find(l,aim,start =mid+1,end=end) #需要return
elif l[mid] > aim:
return find(l, aim, start=start, end=mid-1)
else:
return mid #需要return
else:
return '找不到这个值' #需要ruturn
ret= find(l,3)
print(ret)
c.三级菜单
number = {
'小一': {
'联系方式': {
'微信': {
'私人微信': {},
'工作微信': {},
},
'电话': {
'私人电话': {},
'公司电话': {},
},
},
'地址': {
'房产1': {
'北京': {},
},
'房产2': {},
},
'爱好': {},
'职业': {},
},
'小二': {
'联系方式': {
"微信": {
'私人微信': {},
'工作微信': {},
}
},
'地址': {
'房产1': {
'北京': {},
},
},
},
'小三': {},
}
def threeLM(dic):
while True:
for k in dic:print(k)
key = input('input>>').strip()
if key == 'b' or key == 'q':return key #b是返回上一层
elif key in dic.keys() and dic[key]:
ret = threeLM(dic[key])
if ret == 'q': return 'q'
threeLM(menu)
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