递归函数之二分查找

一、递归

首先引入一个例子

def story():
    s = """
    从前有个山,山里有座庙,庙里老和尚讲故事,
    讲的什么呢?
    """
    print(s)
    story()
    
story()
老和尚讲故事

在一个函数里再调用这个函数本身,其最大层数限制是997,最大层数限制是python默认的

结束递归的标志是:return

修改递归最大深度的手段(一般情况下还是别修改比较好)

import sys
sys.setrecursionlimit(1000000)
n=0
def f():
    global n
    n+=1
    print(n)
    f()
f()
修改递归最大深度

递归解决的问题:

#就是通过参数,来控制每一次调用缩小计算的规模

#适合的场景

#数据的规模在减小,但是解决问题的思路没有改变

 练习:

1.猜年龄游戏

#猜e的年龄
#e比d大两岁
#d比c大两岁
#c比b大两岁
#b比a大两岁 
#a 40了

# 1.a  age(1) = 40
# 2.b  age(1) + 2
# 3.c   age(2) + 2
# 4.d  age(3) + 2
# 5.e  age(4) + 2

def age(n):
    if n == 1:
        return 40
    else:
        ret = age(n-1)
        return ret + 2
age(5)
猜年龄

2.如果一个数可以整除2,就整除,不能整除(*3+1)

def func(num):
    print(num)
    if num==1:
        return
    if num%2==0:
        num=num//2
    else:
        num=num*3+1
    func(num)
func(5)
不能整除2

3.一个数除2到不能整除2为止

def cal(num):
    if num % 2 == 0:
        num  = num // 2
        return cal(num)
    else:
        return num

print(cal(8))
整除2

递归函数与三级菜单

def threeLM(dic):
    while True:
        for k in dic:print(k)
        key = input('input>>').strip()
        if key == 'b' or key == 'q':return key
        elif key in dic.keys() and dic[key]:
            ret = threeLM(dic[key])
            if ret == 'q': return 'q'
        elif (not dic.get(key)) or (not dic[key]) :
            continue

threeLM(menu)
View Code

二、二分查找算法

如果有这样一个列表,让你从这个列表中找到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]

二分查找算法

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]

你观察这个列表,这是不是一个从小到大排序的有序列表呀?

如果这样,假如我要找的数比列表中间的数还大,是不是我直接在列表的后半边找就行了?

这就是二分查找算法

简单二分法

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 func(l,aim):
    mid = (len(l)-1)//2
    if l:
        if aim > l[mid]:
            func(l[mid+1:],aim)
        elif aim < l[mid]:
            func(l[:mid],aim)
        elif aim == l[mid]:
            print("bingo",mid)
    else:
        print('找不到')
func(l,66)
func(l,6)

二分法基础版
简单版
def func(l, aim,start = 0,end = len(l)-1 ):
    mid = (start+end)//2
    if not l[start:end+1]:
        return
    elif aim > l[mid]:
        return func(l,aim,mid+1,end)
    elif aim < l[mid]:
        return func(l,aim,start,mid-1)
    elif aim == l[mid]:
        print("bingo")
        return mid

index = func(l,68)
print(index)

二分法查找升级版
升级版
原文地址:https://www.cnblogs.com/moning/p/7265103.html