您的位置:首页 > 编程语言 > Python开发

python基础之递归、二分法

2017-04-14 14:11 302 查看

一 递归

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==1: return 1 if num>1: return func(num-1)*num k = func(5) print(k) #最后k等于120

def func(5):
if 5==1:
return 1
if 5>1:
return func(4)*5 #返回时func(4) 等于 24 , func(4)*5

def func(4):
if 4==1:
return 1
if 4>1:
return func(3)*4 #返回时func(3) 等于 6 , func(3)*4 等于 24

def func(3):
if 3==1:
return 1
if 3>1:
return func(2)*3 #返回时func(2) 等于 2 , func(2)*3 等于 6

def func(2):
if 2==1:
return 1
if 2>1:
return func(1)*2 #返回时func(1) 等于 1 , func(1)*2 等于 2

def func(1):
if 1==1:
return 1 #最终得出结论func(1) 等于 1,开始返回
"""


使用实例:

猜年龄游戏:

小白问小黄年龄多少,小黄说比小蓝大两岁。又问小蓝年龄多少,小蓝说比小红大两岁。

又问小红年龄多少,小红说比小绿大两岁。又问小绿年龄多少,小绿说比小青大两岁。、

又问小青多大,小青说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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: