Python递归及二分查找算法

什么是函数的递归??

如果一个函数在内部调用自身本身,这个函数就是递归函数。

实例

#直接调用自己
def func():
    print("form yang")
    func()
func()

#实例二、间接调用自己
def func1():
    print("from yang")
    func2()

def func2():
    print("from hao")
    func1()
func1()

#当你在PyCharm执行时会出现:maximum recursion depth exceeded while calling a Python object,你不用管他,直接向上翻

此时我们再来说说上面报的:maximum recursion depth exceeded while calling a Python object的错误,翻译成中文意思为(在调用Python对象时超过了最大递归深度),什么叫做超过了最大递归深度?原因很简单递归并不是说能无限进行递归的,他是有个最大值998当超过这个值之后便会出现上面的错误

count = 0
def func():
    global count
    count = count +1
    print(count)
    func()
func()

执行上面的代码可以看出,在未报错之前能看见的最大数字就是998,当然我们也可以通过一些手段去修改他

import sys
print(sys.setrecursionlimit(1000000))
def foo(n):
    print(n)
    n +=1
    foo(n)
foo(1)

刚刚我们将Python递归深度设置为100W,至于实际可以到达的深度就取决于计算机的性能。(可以通过这串代码测试电脑好坏哦)
建议
上面我可以修改递归的最大深度,但这里不推荐修改这个默认的递归深度,因为当你的递归深度达到最大深度还未解决你的问题,那你就放弃递归吧!

二分查找算法

引言

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

i = 0
for num in l:

    if num == 66:

        print(i)

    i+=1

上面我们实现了从列表中找到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 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)

升级版二分法

l1 = [1, 2, 4, 5, 7, 9]
def two_search(l,aim,start=0,end=None):
    end = len(l)-1 if end is None else end
    mid_index = (end - start) // 2 + start
    if end >= start:
        if aim > l[mid_index]:
            return two_search(l,aim,start=mid_index+1,end=end)

        elif aim < l[mid_index]:
            return two_search(l,aim,start=start,end=mid_index-1)

        elif aim == l[mid_index]:
            return mid_index
        else:
            return '没有此值'
    else:
        return '没有此值'
print(two_search(l1,9))
posted @ 2018-06-11 15:52  杨灏  阅读(249)  评论(0编辑  收藏  举报