python 学习 D15 递归函数 二分查找法

#递归函数
#: 自己调用自己
# 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))
 
 
 
 
 
 

猜你喜欢

转载自www.cnblogs.com/HoneyTYX/p/9057815.html
今日推荐