zoukankan      html  css  js  c++  java
  • 函数的递归调用与二分法

    一,什么是递归?

    递归的作用可以完全取代循环,很多函数编程语言中习惯用递归来实现循环

    1,递归算法:  (1),'重复' ,凡是通过循环语句可以实现的,都可以用递归来实现

            (2),'将问题分解成同类的子问题', 如持续循环的运算操作,持续循环的判断操作,他们的每次循环都是同样的一个'动作',这个动作就是一个子问题

    2,函数的递归调用:

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

        

      递归必须满足两个条件:

        1, 每进入下一次递归调用,问题的规模都应该有所减少

        2, 递归必须有一个明确的结束条件

    # 求1,2,3, ...,n加法和(recursion.add.py)
    
    def recursion_sum(num):  # 定义递归函数
        if num == 1:  # 分解到最小数1
            return num  # 返回最小分解数1给上一层
        return recursion_sum(num - 1) + num     # 自己调用自己,重复动作:两个相邻的数相加
    
    
    print(recursion_sum(666))       # 调用递归函数并打印结果

    3,递归函数在内存中的运行原理

    总体实现思想: 递归一次,在内存中开辟一个新的地址空间,记录递归过程状态,一直递归分解到最小范围,最后得出要么找到对应的值,要么返回找不到的结果.

    递归算法其实分为缩小范围和求职结果的层层返回两大步骤,类似于数据结构中调用栈(stack)的进栈和出栈操作

     4,递归函数

      优点: 递归的力量显然在于通过有限陈述来定义无限的对象集合的可能性,即使这个程序没有明确的重复,也可以用有限递归程序来描述无限次的计算.

    (不同的查找值查找过程次数不确定,使用递归可以灵活的解决)

      缺点: 当所计算的对象数量变得庞大起来时,内存空间压力就大增,如二分法每递归调用一次,需要新开辟一个地址空间,如需要查找的数据集元素达到超级多的时候,很容易是内存空间崩溃.

    二分法查找

    # 二分法查找,自定义递归函数
    def r_dichotomy(nums, find, left, right):
        # 求商的整数,取中间值的索引
        middle = (right + left) // 2
        # 找到列表中的值
        if nums[middle] == find:
            # 返回找到值对应的索引
            return middle
        # 若指定范围只有一个未找元素
        if right == left + 1:
            if nums[middle] != find:
                # 没有找到元素,返回-1,-1代表没有找到
                return -1
            #值的查找范围在[left,middle)之间,在左边递归查找
            if nums[middle] > find:
                return r_dichotomy(nums,find, left, middle)
            #值的查找范围在(middle,right]之间,在右边递归查找
            elif nums[middle] < find:
                return r_dichotomy(nums,find,middle,right)
    
    #调用递归函数
    nums = [3, 5, 7, 11, 13, 23, 24, 76, 103, 111, 201, 202, 250, 303, 341]
    print(r_dichotomy(nums,999,0,len(nums)))
  • 相关阅读:
    如何打开“USB调试”模式?
    Eclipse常用配置
    【luogu P5363】移动金币(博弈论)(DP)(数位DP)(MTT)
    【luogu P4245】【模板】任意模数多项式乘法(拆系数FFT)(MTT)
    【ybtoj高效进阶 21178】星际大战(并查集)
    【ybtoj高效进阶 21177】小小网格(杜教筛)(数论分块)(莫比乌斯反演)
    【luogu P4213】【模板】杜教筛(Sum)(数学)(整除分块)
    【luogu P6860】象棋与马(数学)(杜教筛)
    【luogu AT2376】Black and White Tree(结论)(博弈论)(二分图)
    SAM入门三题:字符串水题, LCS, P5546 [POI2000]公共串
  • 原文地址:https://www.cnblogs.com/kp1995/p/10061308.html
Copyright © 2011-2022 走看看