Python之递归函数
时间:2022-05-08
本文章向大家介绍Python之递归函数,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
递归函数
初识递归函数
递归函数的定义:在一个函数里再调用这个函数本身
Python为了考虑保护内存占用情况,有一个递归深度的限制。
探究递归的默认最大深度:
def foo(n):
print(n)
n += 1
foo(n)
foo(1)
强制的将递归层数控制在了997,此后会报错,报错只是计算机为了保护内存。当然了,997是python为了我们程序的内存优化所设定的一个默认值,我们当然还可以通过一些手段去修改它:
import sys
print(sys.setrecursionlimit(100000))
n = 0
def story():
global n
n += 1
print(n)
story()
story()
输出不会报错,但也会有个自动退出的值,这个值适合计算机的自身配置有关,一般情况都是3222,MAC会更大点。 递归的优缺点 缺点:比较占用内存,如果需要递归次数太多,就不太合适用递归算法来解决问题。
优点:会让代码简单
人理解循环,神理解递归。
解题理解递归
例一:
现在你们问我,alex老师多大了?我说我不告诉你,但alex比 egon 大两岁。
你想知道alex多大,你是不是还得去问egon?egon说,我也不告诉你,但我比武sir大两岁。
你又问武sir,武sir也不告诉你,他说他比金鑫大两岁。
那你问金鑫,金鑫告诉你,他40了。。。
这个时候你是不是就知道了?alex多大?
1 |
金鑫 |
40 |
---|---|---|
2 |
武sir |
42 |
3 |
egon |
44 |
4 |
alex |
46 |
你为什么能知道的?
首先,你是不是问alex的年龄,结果又找到egon、武sir、金鑫,你挨个儿问过去,一直到拿到一个确切的答案,然后顺着这条线再找回来,才得到最终alex的年龄。这个过程已经非常接近递归的思想。
我们就来具体的我分析一下,这几个人之间的规律。
age(4) = age(3) + 2
age(3) = age(2) + 2
age(2) = age(1) + 2
age(1) = 40
我们写成递归函数,就是:
def age(n):
if n == 1:
return 40
else:
return age(n-1)+2
print(age(4))
分步骤分析这个递归函数
def age(1):
if 1 == 4:
return 40
elif 1 >0 and 1 < 4:
return age(1+1) + 2
def age(2):
if 2 == 4:
return 40
elif 2 >0 and 2 < 4:
return age(2+1) + 2
def age(3):
if 3 == 4:
return 40
elif 3 >0 and 3 < 4:
return age(3+1) + 2
def age(4):
if 4 == 4:
return 40
elif 3 >0 and 3 < 4:
return age(3+1) + 2
例二:用二分法理解递归
二分查找算法 必须处理有序的列表
比如现在有一个列表,寻找指定数字,用二分法怎样实现
def find(l,aim,start = 0,end = None):
end = len(l) if end is None else end
mid_index = (end - start)//2 + start
if start <= end:
if l[mid_index] < aim:
return find(l,aim,start =mid_index+1,end=end)
elif l[mid_index] > aim:
return find(l, aim, start=start, end=mid_index-1)
else:
return mid_index
else:
return '找不到这个值'
l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
ret= find(l,66)
print(ret)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- flutter ExpansionTile 层级菜单的实现
- Ubuntu下如何创建XFS文件系统的LVM详解
- 华为开源内部OpenJDK定制版:“毕昇 JDK 8”
- Linux定时任务Crontab命令使用详解与总结
- kotlin实现通知栏提醒功能示例代码
- Linux自动删除n天前日志及实例命令
- Flutter学习教程之Route跳转以及数据传递
- PHP实现限制域名访问的实现代码(本地验证)
- 吸引发烧友的视听Linux发行版
- Linux下完全删除用户的两种方法
- flutter实现轮播图效果
- Ubuntu 16.04设置PostgreSQL开机启动的方法
- 使用userdel命令删除Linux用户的教程详解
- Linux系统交换空间介绍
- 小内存服务器上宝塔默认安装的MySQL如何优化配置