一 递归
1. 必须有一个明确的结束条件
2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,
函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,
栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,
所以,递归调用的次数过多,会导致栈溢出)
注:栈遵循先进后出,先吃后拉原则。
递归能干得事,while True都能干。
查看和修改栈的大小:
>>> import sys
>>> sys.getrecursionlimit()
1000
>>>
>>> sys.setrecursionlimit(10000)
>>> sys.getrecursionlimit()
10000
>>>
递归初识:
part1:
def test():
test()
test()
输出结果:
#part2:
#:有一个明确的结束条件
def test(n):
print(n)
n = n -1
if n >=1:
test(n)
test(5)
输出结果:
#part3
def calc(n):
print(n)
if int(n/2)==0:
return n
return calc(int(n/2))
print('********',calc(10))
输出结果:
#part4
# 5 = 5*4*3*2*1(实现阶乘)
def func(num):
if num==1:
return 1
if num>1:
return func(num-1)*num
k = func(5)
print(k)
输出结果:
分析过程:
"""
def func(num):
if num==:
return
if num>:
return func(num-)*num
k = func()
print(k) #最后k等于120 def func():
if ==:
return
if >:
return func()* #返回时func() 等于 , func()* def func():
if ==:
return
if >:
return func()* #返回时func() 等于 , func()* 等于 def func():
if ==:
return
if >:
return func()* #返回时func() 等于 , func()* 等于 def func():
if ==:
return
if >:
return func()* #返回时func() 等于 , func()* 等于 def func():
if ==:
return #最终得出结论func() 等于 ,开始返回
"""
使用实例:
猜年龄游戏:
小白问小黄年龄多少,小黄说比小蓝大两岁。又问小蓝年龄多少,小蓝说比小红大两岁。
又问小红年龄多少,小红说比小绿大两岁。又问小绿年龄多少,小绿说比小青大两岁。、
又问小青多大,小青说10岁了。问小黄现在多大?
分析:
age(5)=age(4)+2 n=5 age(n)=age(n-1)+2
age(4)=age(3)+2 n=4 age(n)=age(n-1)+2
age(3)=age(2)+2 n=3 age(n)=age(n-1)+2
age(2)=age(1)+2 n=2 age(n)=age(n-1)+2
age(1)=10 n=1 age(n)=10
n=1 res=10
n>1 res=age(n-1)+2
答案:
def age(n):
if n == 1:
return 10
else:
return age(n-1)+2 print(age(5))
二 二分法
猜数字是否在列表内游戏:
# data=[]
# for i in range(1,100000,2):
# data.append(i) data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35]
# num=19
# i=0
# while True:
# if num == data[i]:
# print('find it')
# break
# i+=1 def search(num,data):
print(data)
if len(data) > 1:
#二分
mid_index=int(len(data)/2)
mid_value=data[mid_index]
if num > mid_value: #19>18
#num在列表的右边
data=data[mid_index:] #data[0:]-->[18]
search(num,data)
elif num < mid_value:
#num在列表的左边
data=data[:mid_index]
search(num,data)
else:
print('find it')
return
else:
if data[0] == num:
print('find it')
else:
print('not exists') # search(9527,data)
search(15,data)
# search(1,data)