【笔记】递归函数
递归函数概念:简单来讲,就是自己调用自己的函数,在函数体内直接或者间接的调用自己。需要注意的是递归函数需要包含两个部分,1、终止字符,用来停止调用,一般用于返回值。2、递归步骤,把第你、步和第n-1补结合起来。
def test01():#这是一个没有终止字符的函数
print('test01()')
test01()
test01()
以上示例就是一个没有终止字符的函数,会因为栈内存不足导致程序崩溃。
def test01(n):
print('test01:',n)
if n==0:
print('程序结束')
else:
test01(n-1)
print(n)
test01(4)
运行结果:test01: 4
test01: 3
test01: 2
test01: 1
test01: 0
程序结束
1
2
3
4
程序结束
这就是一个简单的递归函数了,我们发现"test01:n"和"n"中的n值是相反的,来分析一下这个函数的运行步骤,当n=4时,调用函数test01(4),栈中会产生一个栈帧,然后打印test01: 4,进行判断,n>0,因此会调用函数test01(3),这是test01(4)这个函数是暂时挂起的状态,先运行test01(3),好了,在test01(3)里,先打印出test01: 3,然后进行判断,n还是大于0,继续调用函数test01(n-1),也就是test01(2),同样这是test01(3)一样会暂时挂起,以此类推,当运行test01(0)时,同样先打印test01: 0,进行判断,n=0,打印“程序结束”,然后test01(0)这个函数就结束了,然后再返回来运行test01(1),打印n的值,也就是1,这时test01(1)也已经运行结束了,就会继续返回运行test01(2),打印2....以此类推,会发现最后出现的n的值和刚开始打印n的值是相反的。
练习:利用递归函数计算阶乘
def test01(n):
if n==1:
return 1
else:
return n*test01(n-1)
a = test01(5)
print(a)
好了,这就是今天学习的内容了 额,这个图片忘记删掉了,是之前自己跟着视频画的函数在栈内的内存图,这个是test01(5)的时候,我代码里面是test01(4),大家凑合看吧 楼主可以考虑加上反汇编,然后用OD调试,同时解释数据,要是可以的话 侃遍天下无二人 发表于 2021-6-20 02:03
楼主可以考虑加上反汇编,然后用OD调试,同时解释数据,要是可以的话
刚开始学,不会{:1_885:} 本质上递归就是对问题的深度遍历,设计的时候要注意返回条件,否则堆栈会被耗尽
页:
[1]