Python - 递归以及斐波那契数列
什么是递归?
程序调用自身的编程技巧称为递归(recursion),递归说通俗一点,就是自己调用自己。
举例子:举个网上的例子
一个小朋友坐在第10排,他的作业本被小组长拿到了第1排,小朋友要拿回他的作业本,可以怎么办?他可以拍拍第9排小朋友,说:“帮我拿第1排的本子”,而第9排的小朋友可以拍拍第8排小朋友,说:“帮我拿第1排的本子”...如此下去,消息终于传到了第1排小朋友那里,于是他把本子递给第2排,第2排又递给第3排...终于,本子到手啦!这就是递归,拍拍小朋友的背可以类比函数调用,而小朋友们都记得要传消息、送本子,是因为他们有记忆力,这可以类比栈。
一、阶乘运算
实现阶乘运算: n...5x4x3x2x1
'''
n...5*4*3*2*1
n*(n-1)
'''
def fac(n):
if n==1:
return 1
else:
return n*fac(n-1)
print(fac(4))
'''
代码运行过程:
n = 4, 运行这行代码 return n*fab(n-1) --> 4*fac(3), 接着调用自身函数 fac()
n = 3, 运行这行代码 return n*fab(n-1) --> 4*3*fac(2), 接着调用自身函数 fac()
n = 2, 运行这行代码 return n*fab(n-1) --> 4*3*2fac(1), 接着调用自身函数 fac()
n = 1, fac(1)=1 --> 4*3*2fac(1) --> 4*3*2*1
'''
使用递归需要注意的点:
- 必须要有结束条件,不然就会进入死循环
- 每次进入更深一层递归时,问题规模(计算量)相比上次递归都应有所减少
- 递归执行效率不高,递归层次过多会导致栈溢出,所以使用递归的时候要注意
二、斐波那契数列
斐波那契数列(Fibonacci sequence),又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……
查找规律:
f(1)=1
f(2)=1
...
f(n)=f(n-1)+f(n-2) n >3
代码:
def fib(n):
''' 斐波那契数列 '''
if n <= 2:
''' 数列前两个数都是1 '''
r = 1
return r # 返回结果,并结束函数
else:
r = fib(n-1)+fib(n-2) # 由数据的规律可知,第三个数的结果都是前两个数之和,所以进行递归叠加
return r # 返回结果,并结束函数
# print(fab(4)) # 3,调用函数并打印结果
'''
执行过程分析:
传入的 n=4, 执行: r = fib(n-1)+fib(n-2) ---> fib(3)+fib(2)
fib(3)+fib(2) ---> fib(3) 执行后 ---> fib(2)+fib(1); fib(2)=1; fib(1)=1
所以: fib(3)+fib(2) = fib(2)+fib(1)+fib(2) = 1+1+1 =3
'''
青蛙跳台阶算法,每次可以跳1级或两级,请问有n级台阶,有多少种算法
1.当青蛙跳跳一个台阶时,只有1中跳法 1 --- f(1)=1
2.当青蛙跳跳2个台阶时,只有2中跳法 1 1;2 -- f(2)=2
3.当青蛙跳跳2个台阶时,只有2中跳法 1 1 1;1 2;2 1 --- f(3)=3 ,
同理 f(4)=5
------f(n)=f(n-1)+f(n-2)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现