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 <end:
        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  ------- 解决

  

猜你喜欢

转载自www.cnblogs.com/dacheng-tony/p/9028048.html
今日推荐