一,什么是递归python
在函数中调用自身函数ide
二,楔子函数
从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呢?从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呢?从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呢?从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呢......这个故事大家不喊停我能讲一天!咱们说,生活中的例子也能被写成程序性能
while True:
story = "
从前有个山,山里有座庙,庙里老和尚讲故事,
讲的什么呢?
"
print(story)
def story():
s = """
从前有个山,山里有座庙,庙里老和尚讲故事,
讲的什么呢?
"""
print(s)
while True:
story()
尝试:经过调用自己(递归)的方式测试
def story():
s = """
从前有个山,山里有座庙,庙里老和尚讲故事,
讲的什么呢?
"""
print(s)
story()
story()
先无论函数最后的报错,除了报错以外,咱们能看的出来,这一段代码和上面的代码执行效果是同样的。优化
三,认识递归spa
递归的定义——在一个函数里再调用这个函数自己code
如今咱们已经大概知道刚刚讲的story函数作了什么,就是在一个函数里再调用这个函数自己,这种魔性的使用函数的方式就叫作递归。blog
刚刚就已经写了一个最简单的递归函数。递归
递归的最大深度——997
正如大家刚刚看到的,递归函数若是不受到外力的阻止会一直执行下去。可是咱们以前已经说过关于函数调用的问题,每一次函数调用都会产生一个属于它本身的名称空间,若是一直调用下去,就会形成名称空间占用太多内存的问题,因而python为了杜绝此类现象,强制的将递归层数控制在了997
def foo(n): print(n) n += 1 foo(n) foo(1)
由此咱们能够看出,未报错以前能看到的最大数字就是997.固然了,997是python为了咱们程序的内存优化所设定的一个默认值,咱们固然还能够经过一些手段去修改它:
import sys print(sys.setrecursionlimit(100000))
咱们能够经过这种方式来修改递归的最大深度,刚刚咱们将python容许的递归深度设置为了10w,至于实际能够达到的深度就取决于计算机的性能了。不过咱们仍是不推荐修改这个默认的递归深度,由于若是用997层递归都没有解决的问题要么是不适合使用递归来解决要么是你代码写的太烂了
四,递归
举个例子来讲明递归能作的事情。
例一:
如今大家问我,alex老师多大了?我说我不告诉你,但alex比 egon 大两岁。
你想知道alex多大,你是否是还得去问egon?egon说,我也不告诉你,但我比武sir大两岁。
你又问武sir,武sir也不告诉你,他说他比金鑫大两岁。
那你问金鑫,金鑫告诉你,他40了。。。
这个时候你是否是就知道了?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))