• 递归调用、 二分法


    1  递归调用

    2  二分法


     6.15 递归调用

    6.15.1 递归调用

    递归调用:在调用一个函数的过程中,直接或者间接又调用该函数本身,称之为递归调用

    递归必备的两个阶段:1、递推  2、回溯

    # salary(5)=salary(4)+300
    # salary(4)=salary(3)+300
    # salary(3)=salary(2)+300
    # salary(2)=salary(1)+300
    # salary(1)=100
    #
    # salary(n)=salary(n-1)+300     n>1
    # salary(1) =100                n=1
     
    def salary(n):
        if n == 1:
            return 100
        return salary(n-1)+300
     
    print(salary(5))

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

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

    6.15.3 修改递归最大深度

    import sys
    sys.getrecursionlimit()
    sys.setrecursionlimit(2000)
    n=1
    def test():
        global n
        print(n)
        n+=1
        test()
    test()
     
    #虽然可以设置,但是因为不是尾递归,仍然要保存栈,内存大小一定,不可能无限递归

    6.16 二分法

    l=[1,2,10,30,33,99,101,200,301,402] #从小到大排列的数字列表
    
    def binary_search(l,num):
        print(l)
        if len(l) == 0:
            print('not exists')
            return
        mid_index=len(l) // 2
        if num > l[mid_index]:   #往右找
            binary_search(l[mid_index+1:],num)
        elif num < l[mid_index]:  #往左找
            binary_search(l[0:mid_index],num)
        else:
            print('find it')
    # binary_search(l,301)
    binary_search(l,302)
  • 相关阅读:
    一步一步教你使用Jmail实现邮件的接收与发送
    超级简单:使用FOR XML AUTO控制XML输出
    WF4.0工作流设计器快捷键
    糟糕编程的白痴指南
    WPF:全文翻译小工具
    获取为以逗号分隔列值的字符串
    WF 4.0 RC 学习资源
    这个杀手不太冷
    《Expert Cube Development with Microsoft SQL Server 2008 Analysis Services》读书笔记第九章:保护Cube(二)
    windows server 2008下无法检查到无线信号的解决方法
  • 原文地址:https://www.cnblogs.com/snailgirl/p/8125041.html
Copyright © 2020-2023  润新知