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