#递归函数
#: 自己调用自己
# def func1(): # print(666) # func1() # func1() # import sys # sys.setrecursionlimit(100000)
# 默认最大递归深度 998
count = 0 def func1(n): n += 1 print(n) func1(n) func1(count)
PS
太白 23 岁, 日天比太白大两岁, wusir比日天大两岁, alex比wusir大两岁 求出alex的年纪
# def age(n): # if n == 1: # return 23 # else: # return age(n-1) + 2 # # print(age(4)) # 23 + 2 + 2 + 2
分解步骤:
""" def age(4): if n == 1: return 23 else: return age(n-1) + 2 age(4) = age(3) + 2 ret = age(4) def age(3): if n == 1: return 23 else: return age(n-1) + 2 age(3) = age(2) + 2 def age(2): if n == 1: return 23 else: return age(1) + 2 age(2) = age(1) + 2 def age(1): if n == 1: return 23 age(1) = 23 else: return age(1) + 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]
在此列表找到 66 的索引
第一种方法
# print(l.index(66))
第二种方法
# count = 0 # for i in l: # if i == 66: # print(count) # count += 1 # for i in range(len(l)): # if l[i] == 47: # print(i) # break # # else: # print('找不到....')
第三种方法
思路 :
目标值:aim = 66
寻找中间索引: min_index = len(l) // 2
aim 与 中间索引对应的值进行比较
aim > l[min_index]:
l[min_index+1:]
aim < l[min_index]:
l[:min_index-1]
aim == l[min_index]
return min_index
第一次尝试版
# print(len(l)) # l1 = [1, 3, 5, 7, 8, 10, 11] # def binary_search(li,aim): # 1次:[1, 3, 5, 7, 8, 10, 11] aim 8 2次 :li = [ 8, 10, 11] 8 # mid_index = len(li) // 2 # 1次:min_index: 3 2 次:min_index 1 3次:0 # # if aim > li[mid_index]: # 1次:8 > 7 # return binary_search(li[mid_index+1:], aim) # [ 8, 10, 11] 8 # # elif aim < li[mid_index]: # 2 次:8 < 10 # return binary_search(li[:mid_index], aim) # 3次: [8] 8 # # elif aim == li[mid_index]: # return mid_index # else: # return None # print(binary_search(l1,8))
第二次尝试版
# l1 = [1, 3, 5, 7, 8, 10, 11] # # def binary_search(li,aim,start=0,end=None): # 第一次:[1, 3, 5, 7, 8, 10, 11] aim 6,start 0,end 6 # # 第二次:[1, 3, 5, 7, 8, 10, 11] aim 6 start:0,end:3 # # 第三次:[1, 3, 5, 7, 8, 10, 11] aim 6 start:2,end:3 # # 第四次:[1, 3, 5, 7, 8, 10, 11] aim 6 start:3,end:3 # # 第五次:[1, 3, 5, 7, 8, 10, 11] aim 6 start:3,end:3 # end = len(li) - 1 if end is None else end # mid_index = (end - start) // 2 + start # 第一次 mid 3 第二次:mid 1 第三次:mid:2 第四次:mid:3 # # if aim > li[mid_index]: # return binary_search(li, aim, start=mid_index+1, end=end) # 第二次:[1, 3, 5, 7, 8, 10, 11] aim 6 start: 2 end:3 # # 第三次:[1, 3, 5, 7, 8, 10, 11] aim 6 start: 3 end:3 # elif aim < li[mid_index]: # return binary_search(li, aim, start=start, end = mid_index) # 第一次:[1, 3, 5, 7, 8, 10, 11] aim 6 start:0,end:3 # # 第四次:[1, 3, 5, 7, 8, 10, 11] aim 6 start:3,end:3 # elif aim == li[mid_index]: # return mid_index # else: # return None # # print(binary_search(l1,6))
第三次最终版
l1 = [1, 3, 5, 7, 8, 10, 11] def binary_search(li,aim,start=0,end=None): # 第一次:[1, 3, 5, 7, 8, 10, 11] aim 6,start 0,end 6 # 第二次:[1, 3, 5, 7, 8, 10, 11] aim 6 start:0,end:3 # 第三次:[1, 3, 5, 7, 8, 10, 11] aim 6 start:2,end:3 # 第四次:[1, 3, 5, 7, 8, 10, 11] aim 6 start:3,end:3 # 第五次:[1, 3, 5, 7, 8, 10, 11] aim 6 start:3,end:3 end = len(li) if end is None else end mid_index = (end - start) // 2 + start # 第一次 mid 3 第二次:mid 1 第三次:mid:2 第四次:mid:3 if start <= end: if aim > li[mid_index]: return binary_search(li, aim, start=mid_index+1, end=end) # 第二次:[1, 3, 5, 7, 8, 10, 11] aim 6 start: 2 end:3 # 第三次:[1, 3, 5, 7, 8, 10, 11] aim 6 start: 3 end:3 elif aim < li[mid_index]: return binary_search(li, aim, start=start, end = mid_index) # 第一次:[1, 3, 5, 7, 8, 10, 11] aim 6 start:0,end:3 # 第四次:[1, 3, 5, 7, 8, 10, 11] aim 6 start:3,end:3 elif aim == li[mid_index]: return mid_index else: return None print(binary_search(l1,11))