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