23函数----递归
递归调用是函数嵌套调用的一种特殊形式,函数在调用时,直接或间接调用了自身
python解释器的内存管理机制为了防止无限制调用,对递归调用做了最大的层级限制
三个特点:
1、要有确定的结束条件
2、问题规模要一步一步的减小
3、函数的等价关系式
例1、问路
import time person_list = ['cc', 'dd','ff','ll', 'ee', 'mm'] def ask_way(person_list): if len(person_list) == 0: return '没有知道' person = person_list.pop(0) #问题的规模要减少 if person == 'ee': #结束的条件 return '{}说:路在318号'.format(person) print('hi,{},???'.format(person)) print('你去问{}'.format(person_list)) time.sleep(2) return ask_way(person_list) res = ask_way(person_list) print(res)
例2、阶乘
# 计算阶乘 def func(i): if i == 1: #要有明确的结束条件 return 1 return func(i-1) * (i) s = func(3) print(s) # 也可以用普通的循环的来实现阶乘 def func(i): s = 1 for x in range(1,i+1): s *= x print(s) func(3)
例3、斐波那契数列(黄金分割数列、兔子数列)
# 非递归方式 def f(n): x1,x2 = 0,1 while x1<n: x1,x2 = x2,x1+x2 yield x1 #yield,生成器 g = f(40) for i in g:print(i,end=' ') def fib(n): a,b = 0,1 for i in range(n): a, b = b, a+b return a res = fib(8) print(res) # 递归1,只是输出第n个数 def f(n): if n == 1:return 1 if n == 0:return 0 else: return f(n-1)+f(n-2) res = f(8) print(res) # 递归2 def fib(a,b,stop): if a>stop: return print(a,end=' ') fib(b,a+b,stop) fib(1,1,34)
4:打印出杨辉三角形
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
其实这种问题,看的更多的不是编程技巧,而是对问题的理解程度,要找到问题其中的规律,然后才有可能用编程语言来表达问题,进而解决问题。
def f(i,j):#得到(i,j)的值 if j == 1 or i==j: return 1 return f(i-1,j-1)+f(i-1,j) def fun(n): for i in range(1,n): for j in range(1,i+1): print(f(i,j), end=' ') print() fun(6)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】