python二分法递归_python基础之递归、二分法

一 递归

1. 必须有一个明确的结束条件

2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少

3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,

函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,

栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,

所以,递归调用的次数过多,会导致栈溢出)

注:栈遵循先进后出,先吃后拉原则。

递归能干得事,while True都能干。

查看和修改栈的大小:

>>> import sys

>>> sys.getrecursionlimit()

1000

>>>

>>> sys.setrecursionlimit(10000)

>>> sys.getrecursionlimit()

10000

>>>

递归初识:

part1:

def test():

test()

test()

输出结果:

1025100-20170515201855853-326364627.png

#part2:

#:有一个明确的结束条件

def test(n):

print(n)

n = n -1

if n >=1:

test(n)

test(5)

输出结果:

1025100-20170515201809978-1753771912.png

#part3

def calc(n):

print(n)

if int(n/2)==0:

return n

return calc(int(n/2))

print('********',calc(10))

输出结果:

1025100-20170515202036275-938773397.png

#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)

输出结果:

1025100-20170515202326744-1038017544.png

分析过程:

"""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)*5def func(4):if 4==1:return 1

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

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

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

使用实例:

猜年龄游戏:

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

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

又问小青多大,小青说10岁了。问小黄现在多大?

分析:

1025100-20170414154731548-319849926.png

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值