zoukankan      html  css  js  c++  java
  • 递归函数 二分查找法 的一些用法

    #递归函数
    #: 自己调用自己
    # 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))
    
    
    
     
     
     
     
  • 相关阅读:
    Android(java)学习笔记92:Android线程形态之 AsyncTask (异步任务)
    Android(java)学习笔记91:Eclipse中代码提示去掉@override,不然就报错!
    Android(java)学习笔记90:TextView 添加超链接(两种实现方式)
    Android(java)学习笔记89:Bundle和Intent类使用和交互
    Android(java)学习笔记88:BaseAdapter适配器重写之getView()
    PHP笔记08:数据库编程---使用php的MySQL扩展库操作MySQL数据库
    Android(java)学习笔记87:Android音视频MediaRecorder用法
    Android(java)学习笔记86:Android提供打开各种文件的API接口:setDataAndType
    HDU 5480 Conturbatio
    HDU 5479 Scaena Felix
  • 原文地址:https://www.cnblogs.com/HoneyTYX/p/9057815.html
Copyright © 2011-2022 走看看