系列文章目录

一、递归函数

  • 概念:

    函数的递归调用是指在函数的执行过程中,直接或间接的调用函数自身。它的效果类似于循环。

  • 格式:

    def foo():
        print('嘤嘤嘤')
        foo()  # 自己调用自己
        
    foo()  # 会一直嘤嘤嘤
    
  • 递归出口:

    递归出口,类似于循环的结束标志,就是递归函数结束的标志,比如:某个整数值变为0时,就结束函数的递归调用。

    如果没有递归出口(比如上面的foo),则会陷入死循环,且会消耗完所有的内存空间。

  • 举例:

    打印嵌套列表中的所有元素,不打印列表:

    l = [1, 2,[3, 4, [5], 6], 7]
    
    def foo(l):
        for i in l:
            if type(i) is list:
                foo(i)  # 如果元素是列表类型,就调用自身继续判断
            else:
                print(i)
    
    foo(l)
    """ 打印: 1 2 3 4 5 6 7 """
    

二、二分法查找

  • 二分法查找是一种查找特定元素的算法:

    1. 先找到有序序列的中间元素。

    2. 判断该元素是否为要查找的目标元素。

    3. 如果是,表示找到目标元素,结束查找。

      如果不是,就判断中间元素与目标元素的大小。

    4. 如果,中间元素>目标元素:就从中间元素的左边(小于中间元素的部分)开始找起,从第1步开始。

      如果,中间元素<目标元素:就从中间元素的右边(大于中间元素的部分)开始找起,从第1步开始。

  • 举例:

    从有序列表中找出指定元素,使用递归的方法:

    l = [0, 3, 4, 5, 9, 17, 45, 67, 69, 76, 88, 91, 100, 111]
    
    
    def binary_search(l, target):
        if len(l) == 0:
            print('没找到!')
            return
            
        mid_index = len(l) // 2  # 中间元素的索引
        if l[mid_index] < target:
            l = l[mid_index+1:]
            binary_search(l, target)  # 递归调用,继续查找
        elif l[mid_index] > target:
            l = l[:mid_index]
            binary_search(l, target)  # 递归调用,继续查找
        else:
            print('找到了!')
    
    binary_search(l, 8)  # 打印:没找到!
    binary_search(l, 88)  # 打印:找到了!
    
    

    下一篇