zoukankan      html  css  js  c++  java
  • 函数递归,算法二分法

    函数的递归

    # 函数递归调用是函数嵌套调用的一种特殊形式,函数在调用时,直接或间接调用了自身,就是递归调用
    # 调用函数会产生局部的名称空间,占用内存,因为上述这种调用会无需调用本身,python解释器的内存管理机制为了防止其无限制占用内存,对函数的递归调用做了最大的层级限制 
    
    #查看递归次数上限和修改次数上限
    import sys   
    # print(sys.getrecursionlimit())  # 结果不是很精确997次左右
    # sys.setrecursionlimit(2000)  参数是上限次数
    虽然可以设置,但是因为不是尾递归,仍然要保存栈,内存大小一定,不可能无限递归,而且无限制地递归调用本身是毫无意义的,
    递归应该分为两个明确的阶段,回溯与递推

    递归的两个阶段

    #回溯就是从外向里一层一层递归调用下去,
     回溯阶段必须要有一个明确地结束条件,每进入下一次递归时,问题的规模都应该有所减少(否则,单纯地重复调用自身是毫无意义的)
    
    #递推就是从里向外一层一层结束递归
    # 递归函数不要考虑循环的次数 只需要把握结束的条件即可
    
    简单例子
    # def age(n):
    #     if n == 1:  # 必须要有结束条件
    #         return 18
    #     return age(n-1) + 2
    # res = age(5)
    # print(res)

    python中的递归效率低且没有尾递归优化

    #python中的递归
    python中的递归效率低,需要在进入下一次递归时保留当前的状态,在其他语言中可以有解决方法:尾递归优化,即在函数的最后一步(而非最后一行)调用自己,尾递归优化:http://egon09.blog.51cto.com/9161406/1842475
    但是python又没有尾递归,且对递归层级做了限制
    
    #总结递归的使用:
    1. 必须有一个明确的结束条件
    
    2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
    
    3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

    二分法

    想从一个按照从小到大排列的数字列表中找到指定的数字,遍历的效率太低,用二分法(算法的一种,算法是解决问题的方法)可以极大低缩小问题规模
    
    # 算法:解决问题的高效率的方法
    二分法查找,也称为折半法,是一种在有序数组中查找特定元素的搜索算法。
    二分法查找的思路如下:
    (1)首先,从数组的中间元素开始搜索,如果该元素正好是目标元素,则搜索过程结束,否则执行下一步。
    
    (2)如果目标元素大于/小于中间元素,则在数组大于/小于中间元素的那一半区域查找,然后重复步骤(1)的操作。
    
    (3)如果某一步数组为空,则表示找不到目标元素。
    
    target_num = 666
    def get_num(l,target_num):
        if not l:
            print('你给的工资 这个任务怕是没法做')
            return
        # 获取列表中间的索引
        print(l)
        middle_index = len(l) // 2
        # 判断target_num跟middle_index对应的数字的大小
        if target_num > l[middle_index]:
            # 切取列表右半部分
            num_right = l[middle_index + 1:]
            # 再递归调用get_num函数
            get_num(num_right,target_num)
        elif target_num < l[middle_index]:
            # 切取列表左半部分
            num_left = l[0:middle_index]
            # 再递归调用get_num函数
            get_num(num_left, target_num)
        else:
            print('find it',target_num)
    
    get_num(l,target_num)
  • 相关阅读:
    设计模式(08):结构型模式(二) 桥接模式(Bridge)
    设计模式(07):结构型模式(一) 适配器模式(Adapter)
    设计模式(06):创建型模式(五) 原型模式(Prototype)
    node.js获取cookie
    排序算法[转]
    Observer(观察者)设计模式[转]
    c#发送Http请求
    win+R下的命令
    display:inline、block、inline-block的区别
    Redis安装
  • 原文地址:https://www.cnblogs.com/george-007/p/11176974.html
Copyright © 2011-2022 走看看