1.递归函数
2.二分查找
递归函数:自己调用自己,默认递归次数:998. 递归到一定次数就会主动终止,998次(为了保护内存)
例: def func():
print(666)
func()
func()
上面的例子就是简单的递归函数.
可设置递归函数的次数
import sys
sys.setrecursionlimit(设定次数)
def func(n):
n += 1
print
func(n)
n = 0
func(n)
"""alex比佩奇大两岁
佩奇比文周大两岁
文周比太白大两岁
太白26岁
"""
def age(n):
if n == 1:
return 26
else:
return age(n-1) +2
print(age(4)) #age(3) + 2
里面的操作流程分解
"""
def age(4):
if n == 1:
return 26
else:
return age(3) +2
def age(3):
if n == 1:
return 26
else:
return age(2) + 2
def age(2):
if n == 1:
return 26
else:
return age(1) +2
def age(1):
if n == 1:
return 26
else:
return age(0) + 2
print(age(4))
age(4) = 26 + 2+ 2+2
以上就是简单的递归函数.比较绕,喜欢的可以深入了解.
二分查找:二分查找算法,最经典最简单的算法.
使用二分查找算法前提:有序的 不重复的数字序列.
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 index(1,aim):
count = -1
for i in l:
count += 1
if i == aim:
return count
return "没有此值"
print(index(l,84)
用这种方法很慢,如果数据太大的话,就不合适用这种方法.下面我们用一下二分查找算法来实现.
第一版 原列表发生改变,导致索引改变.
l = [2,3,5,10,15,16,18]
def two_find(l,aim):
mid_index = len(l)//2
if aim>l[mid_index]:
return two_find(l[mid_index]+1:],aim)
elif aim<l[mid_index]:
return two_find(l[:mid_index],aim)
elif aim == l[mid_index]:
return mid_index
else:
return None
print(two_find(l,18)
上面这个二分查找算法是错误的,因为每次调用都会改变索引,得到的结果只有0或者1,这不是我们想要的,所以根据上面的问题我们进行了修改.
l = [2,3,5,10,15,16,18]
def func(l,a,start = 0,end = None):
end = len(l) if end != None else end=None
a_index=(end+start)//2
if end >=start:
if a > l[a_index]:
return func(l,a,start = a_index+1,end=end)
elif a< l[a_index]:
return func(l,a,start = start,end = a_index-1)
elif a == l[a_index]:
return a_index
else:
return None
print(func(l,a))
上面这个就是正确的二分查找法,很绕很绕,一定要理解性记忆,否则会死的很惨,有问题一定要及时解决,不要耽搁,弄明白.