高阶函数
接收一个或多个函数作为输入
return返回另一个函数
def add(x, y, f):
return f(x) + f(y)
def get_abs(n):
return int(str(n).strip('-'))
print(add(5, -10, get_abs))
15
递归函数
def calc(n):
print(n)
n = int(n/2)
if n > 0:
calc(n)
print(n)
calc(100)
递归二分查找
2个参数
a = [1,3,4,6,7,8,9,11,15,17,19,21,22,25,29,33,38,69,107]
def split_find(n, a):
if len(a) == 1:
if a[0] == n:
print('%s is in the list' % n)
else:
print('not exists')
mid_index = len(a) // 2
mid_value = a[int(len(a) // 2)]
if n == mid_value:
print('%s is in the list' % n)
return
if n > mid_value:
# print('>')
a = a[mid_index:]
if n < mid_value:
# print('<')
a = a[:mid_index]
split_find(n, a)
split_find(33, a)
print(a.index(33))
4个参数:
a = [1,3,4,6,7,8,9,11,15,17,19,21,22,25,29,33,38,69,107]
def binary_search(start,end,n,d_list):
"""
每次把列表规模折半,查找一个数据最多只需要2的n次方 < len(d_list),是2的多少次方,就是最多查多少次。
假如列表长度为200,那最多只需查询8次(2**8次方)
:param start: 查找的起始位置
:param end: 查找的结束位置
:param n: 要查找的值
:param d_list: 要找的列表
:return:
"""
if start < end: # 查找的范围[start:end]依然大于0个
mid = (start + end)//2 # 找到中间位置
if d_list[mid] > n: # 如果中间的这个值比要找的n大,代表要往d_list[mid]左边找
print("go left",start,mid,end,"--",d_list[start],d_list[mid],d_list[end-1])
binary_search(start,mid,n,d_list)
elif d_list[mid] < n : # 要往右边找,继续折半
print("go right..",start,mid,end,"--",d_list[start],d_list[mid],d_list[end-1])
binary_search(mid+1,end,n,d_list)
else: # 找到了
print("find:",d_list[mid],mid)
else: # 假设start=9,end=9, 那d_list[9:9]已经取不到值了,在这种情况下,只能说明,要找的这个值不在这个列表里
print("cannot find %s in this data list" % n)
binary_search(0, len(a), 22, a)