zoukankan      html  css  js  c++  java
  • 递归


    递归

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

    递归算法的特点:
    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)


  • 相关阅读:
    .IllegalArgumentException: Mapped Statements collection does not contain 异常一例【我】
    Spring配置文件里加载路径中的通配符
    线程池使用Callable示例【我】
    使用Callable和Future接口创建线程
    Java线程池(Callable+Future模式)
    集合切割
    draw call 理解和优化
    Unity 3d导入3dMax模型 产生若干问题
    3dmax做的模型导入U3d后 当模型靠近摄像机时镂空问题
    不管多少个空格替换为一个空格
  • 原文地址:https://www.cnblogs.com/l729414559/p/6876879.html
Copyright © 2011-2022 走看看