python二分法递归_python 【递归 及 二分法】

python 【递归函数 及 二分法】

一、递归的定义

在一个函数里再调用这个函数本身,这种魔性的使用函数的方式就叫做递归。

递归的最大深度——997

#修改递归层数

import sys

sys.setrecursionlimit(10000000)#修改递归层数

n=0

def f():

global n

n+=1

print(n)

f()

f()

我们可以通过以上代码,导入sys模块的方式来修改递归的最大深度。

sys模块:所有和python相关的设置和方法

.  结束递归的标志:return

.递归解决的问题就是通过参数,来控制每一次调用缩小计算的规模

使用场景:数据的规模在减少,但是解决问题的思路没有改变

很多排序算法会用到递归

# 小例子:

# 猜年龄

# alex多大了 alex 比 wusir 大两岁 40+2+2

# wusir多大了 wusir 比 金老板大两岁 40+2

# 金老板多大了 40了

# age(1)

# n = 1 age(2)+2

# n = 2 age(3)+2

# n = 3 age(3) = 40

# def age(n):

# if n == 3:

# return 40

# else:

# return age(n+1)+2

#

# print(age(1))

# # n = 1

# def age(1):

# if 1 == 3:

# return 40

# else:

# return age(2)+2

#

# # n = 2

# def age(2):

# if 2 == 3:

# return 40

# else:

# return age(3)+2

#

# # n = 3

# def age(3):

# if 3 == 3:

# return 40

二、二分算法

# 算法

# 99*99 = 99*(100-1) = 9900-99 = 9801

# 人类的算法

# 99 * 99

# 算法 计算一些比较复杂的问题

# 所采用的 在空间上(内存里) 或者时间上(执行时间) 更有优势的方法

# 排序 500000万个数 快速排序 堆排序 冒泡排序

# 查找

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 cal(l,num,start,end):

mid = (end - start)//2 + start

if l[mid] > num :

cal(l, num, start, mid-1)

elif l[mid] < num: # 13 24

cal(l,num,mid+1,end)

else:

print('找到了',mid,l[mid])

cal(l,60,0,len(l)-1)

#

# def cal(l,num=66):

# length = len(l)

# mid = length//2

# if num > l[mid]:

# l = l[mid+1:]

# cal(l,num)

# elif num < l[mid]:

# l = l[:mid]

# cal(l, num)

# else:

# print('找到了',l[mid],mid)

# cal(l,66)

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 cal(l,66,0,24):

mid = 12 + 0

if 41 > 66 :

cal(l, num, start, mid-1)

elif 41 < 66: # 13 24

cal(l,66,13,24)

else:

print('找到了',mid,l[mid])

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 cal(l,66,13,24):

mid = 5 + 13

if 67 > 66 :

cal(l, 66, 13, 17)

elif l[mid] < num: # 13 24

cal(l,num,mid+1,end)

else:

print('找到了',mid,l[mid])

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 cal(l,66,13,17):

mid = 2 + 13

if 55 > 66 :

cal(l, num, start, mid-1)

elif 55 < 66:

cal(l,66,16,17)

else:

print('找到了',mid,l[mid])

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 cal(l,60,16,17):

mid =0 + 16

if 56 > 60 :

cal(l, num, start, mid-1)

elif 56 < 60: # 13 24

cal(l,60,17,17) #None

else:

print('找到了',mid,l[mid])

#

# 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 cal(l,60,17,17):

mid = 0 + 17

if 60 > 66 :

cal(l, num, start, mid-1)

elif 60 < 66: # 13 24

return cal(l,60,18,17)

else:

print('找到了',17,66)

def cal(l, 60, 18, 17):

if start

mid = 0+18

if 67 > 66:

cal(l, 60, 18,17)

elif 60 < 66: # 13 24

cal(l, 60, 18, 17)

else:

print('找到了', 17, 66)

else:

print('没找到')

# 算法

# def cal(l,num,start=0,end=None):

# # if end is None:end = len(l)-1

# end = len(l)-1 if end is None else end

# if start <= end:

# mid = (end - start)//2 + start

# if l[mid] > num :

# return cal(l, num, start, mid-1)

# elif l[mid] < num: # 13 24

# return cal(l,num,mid+1,end)

# else:

# return mid

# else:

# return None

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

# print(cal(l,56))

# 参数太多 -------- ???

# 找的数不存在 ———— 解决了

# print return ------- 解决

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值