关于什么是递归,这可能不是一两句话说得清楚的,我是不那么理解的,所以我希望结合编程结合数学来理解递归!希望我的想法不天真!
话不多说,直接上代码:
def hello():
print("hello world!")
hello()
hello()
这就是一段简单的递归代码,递归一个重要的标志就是函数自己调用自己(其意义就是完全重复自己的一系列操作)。
其实简单的递归还有下面这样的:
def hello():
print("hello ", end='')
word()
def word():
print("word! \n")
hello()
hello()
hello()就已经是一个简单的递归函数了,这两段代码跑起来都是无限制的打印出hello world!在正常的Python环境下,这个代码会报错:
Traceback (most recent call last):
……
RecursionError: maximum recursion depth exceeded while calling a Python object
这是因为Python解释器自带的一种保护,递归的次数限制,其实也不叫递归次数,因该是叫做递归深度(recursion depth),Python中默认的递归深度是有限制的,但是这个深度可以自己更改,Python3 默认的递归深度是1000次(实际只跑出997次),我加入一个全局变量后统计了函数的调用次数(如下图):
(这个自动加水印的好六呀!)
递归的深度可以自己查看和设置,在sys这个库中,有一个setrecursionlimit()方法。我将其设置为1500次,还是只运行了1497次,这里我暂时还不知道问题所在,还有三次调用去哪里了?
整个代码如下:统计运行次数应该没有问题。
import sys
count = 0
sys.setrecursionlimit(1500)
def hello():
global count
count += 1
print("hello ", end='')
word()
def word():
print("word! \n")
print("共运行了%d次" % count)
hi()
def hi():
print("hi!")
hello()
def helloworld():
global count
count += 1
print("hello world!")
print("共运行了%d次" % count)
helloworld()
# helloworld()
hi()
如果是用hello()运行并统计次数,统计到的次数就是748次,等于1497//2,想来Python的这个递归深度不是指单个递归程序的递归深度,而是指所有与递归相关的函数运行的次数。如果我将递归函数写到三个,那么估计运行次数为1497//3=499次。
果然是这样:(hello调用word,word调用hi,hi又调用hello,最后执行hi())
好了到这里还什么没有讲,先挖个坑,下次开始用递归来解决问题,最后再将递归引入到一些算法中进行讲解!(今天有点偏头痛,我需要出去透透风!)