• 递归



    递归

    特点:
    递归算法是一种直接或者间接的调用自身算法的过程。在计算机编写程序中,递归算法对解决一大类问题是十分有效的

    递归算法的特点:
    1.递归就是在过程或者函数里调用自身
    2.在使用递归策略时,必须由一个明确的递归结束条件,称为递归出口
    3.递归算法解题通常显得简洁,单递归算法解题的运行效率低,所以一般不提倡用递归算法设计程序
    4.在递归调用的过程当中系统为每一层的返回点、局部变量等开辟了栈来存储。递归次数过多容易造成栈溢出等
    5.递归函数在递归解题完成后,函数内部还会逐层回退至退出



    '''
    要求:
    递归算法所体现的"重复"一般有三个要求
    1.每次调用在规模上都有缩小(通常是减半)
    2.相邻两次重复直接有紧密的联系,前一次要为后一次做准备(通常前一次的输出作为后一次的输入)
    3.在问题的规模极小时必须用直接给出解答,而不进行在递归调用,因而每次递归调用的是有条件的(以规模未达到直接解答的大小为条件),
    无条件递归调用会成为死循环,而不能正常结束
    '''
    
    
    #例子:
    def calc(n):
        print(n)
        if n/2 >1:  #递归函数的出口
           return calc(n/2) #函数返回值为自己,传参为(当前参数除以2)
    
    ret = calc(10)  #调用calc函数并传入参数
    print(ret)      #查看返回值

    
    
    #递归实现斐波那契数列
    def func(num1,num2,stop):
        if num1 == 0:               #限定从0开始
            print(num1,num2)
        num3 = num1 + num2          #第一个数加上第二个数
        print(num3)
        if num3<stop:               #stop限定最大值
            func(num2,num3,stop)    #递归自己,传入参数func(num2,num2+num3,stop)
    
    func(0,1,2000)
    
    
    
    
    
    #二分查找
    '''
    利用二分查找,找出一个列表中的某个数字
    
    说明:
    一般查询列表中某一位数字,可用循环遍历的方式从头到尾查找一遍,但如果数据量非常大这样是非常耗时的
    
    二分查找法:
    1.把列表的长度除以2取一个中间值,判断中间是大于或者小于需要查找的数字
    2.如果中间值大于需要查询的数字则继续用此方法往左边查找
    3.如果中间值小于需要查询的数字则继续用此方法往右边查找
    4.递归此方法,直到查询出结果
    '''
    def binary_search(data_source,find_n):
        mid = int(len(data_source) / 2)                             #获取列表长度的中间位置
        if len(data_source) >=1:                                    #列表长度小于1表示没有内容了
            if data_source[mid] > find_n:                           #中间值>查询值,继续往左边找
                print("data in left of [%s]"%data_source[mid])
                binary_search(data_source[:mid],find_n)             #往左切片在递归
            elif data_source[mid] < find_n:                         #中间值<查询值,继续往右边找
                print("data in right of [%s]"%data_source[mid])
                binary_search(data_source[mid:],find_n)             #往右切片结果在递归
            else:
                print("found find [%s]"%data_source[mid])
        else:
            print("cannot find ...")
    
    data = list(range(1,600))
    
    binary_search(data,70)


  • 相关阅读:
    VisualSVN 服务不能自动启动的问题
    "There is already an open DataReader associated with this Command which must be closed first"错误
    LINQ 中调用存储过程自动绑定列名
    vs2008中调试iis7.0托管的程序
    SQL SERVER 2005的一个怪问题: 在查询结果面板中编辑失败.
    在VS2003下把一个DataTable Update 到数据库
    帮人解决一个小问题:QQ空间登录时脚本错误造成无法登入
    关于Sys未定义错误
    多层母版页嵌套中, 内层母版页的事件默认不触发
    线程同步
  • 原文地址:https://www.cnblogs.com/l729414559/p/6876879.html
Copyright © 2020-2023  润新知