函数的递归调用与二分法

Posted kp1995

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数的递归调用与二分法相关的知识,希望对你有一定的参考价值。

一,什么是递归?

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

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)))

 

以上是关于函数的递归调用与二分法的主要内容,如果未能解决你的问题,请参考以下文章

函数递归与二分法

python 3 递归调用与二分法

函数递归与二分法(python3入门)

递归与内置函数

day5-python之递归与二分法

python--函数之递归与二分法