• 递归


    递归调用:在函数调用过程中,直接或间接的调用了函数本身,这就是函数的递归调用 
    1、必须有一个明确的结束条件,当满足条件时结束递推,进行回溯
    2、每次进入更深一层递归时,问题规模相比上次递归都应该有所减少
    3、递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用时通过栈stack这种数据结构实现的,
      每当进入一个函数调用,栈就会增加一层栈帧,每当函数返回,栈就会减少一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。

    4、简单运用:
    def f1():
        print('from f1')
        f1()
    
    f1()   #超出设置的递归次数:RecursionError: maximum recursion depth exceeded while calling a Python object
    
    
    

    5、查看及设置递归次数

    import sys
    print(sys.getrecursionlimit())   #1000  查询出设置的最多可以递归多少层
    sys.setrecursionlimit(10000)    #
    print(sys.getrecursionlimit())   #10000
    

    6、递推年龄

    #有几个人,最小的18岁,每个人都比上一个人大2岁,用递归的方法得到第n个人的年龄
    def age(n):
        if n == 1:
            return 18
        return age(n-1)+2
    
    print(age(5))    #26
    

    7、二分法运用:

    l = [1,3,5,7,9,14,16,17,22,55,66,77,88,99,101,200]
    def search(find_num,seq):
        if len(seq) == 0:#判断是否为空列表,如果不判断,后面切到最后就是一个空列表,IndexError: list index out of range
            print('not find')
            return
        mid_index = len(seq)//2  #地板除,得到整数,1//2=0 ,3//2=1 ,2//2 =1
        mid_num = seq[mid_index]
        if find_num > mid_num:
            seq = seq[mid_index+1:]
            search(find_num,seq)
        elif find_num < mid_num:
            seq = seq[:mid_index]
            search(find_num,seq)
        else:
            print('find it')
    
    search(87,l)
    

      

    
    
  • 相关阅读:
    常用Git代码托管服务分享
    .NET中操作IPicture、IPictureDisp
    Git学习笔记与IntelliJ IDEA整合
    螺旋队列问题
    杂题3道
    .NET 配置文件简单使用
    C++之Effective STL
    不容易理解的 lock 和 merge
    状态模式
    观察者模式
  • 原文地址:https://www.cnblogs.com/wangkc/p/6935520.html
Copyright © 2020-2023  润新知