(一)问题描述
1.1 递归
递归就是反复的调一个函数,但是每回传参的值可能不一样
在实际操作中,递归的例子很多比如阶乘,动态生成树等
下面的代码就是一个简单的递归函数,一直调用下去,没有终止条件 |
def recur(num):
num = num + 1
print(num)
recur(num)
if __name__ == "__main__":
recur(1)
由于没有返回函数,所以会导致栈溢出问题(声明:计算机小白,不是很懂),python报了这样的错误
RecursionError: maximum recursion depth exceeded while calling a Python object
[Previous line repeated 993 more times]
1.2 初步设想解决方法
因为递归的本质是函数里调用函数,第一个函数里调第二个,第二个调第三个,然后一直调用,直至栈区放不下,因为在调用后面的函数时,第一个调用的还没结束,它就会一直在栈区存在,占地方,最后就会导致栈区满了的现象产生,情况如下图所示:
为了防止这种情况的产生,拟采用的方法是,调用的时候记录次数,当调用的次数达到设的阈值时,就退出这一轮的递归调用(注意这里用的是轮,而不是次)
轮:调用阈值次,一轮可以调用好多次函数
次:函数的调用次数
总体思想:循环里套递归,下面就是代码的详细讲述
(二)代码实战
我采用的是while循环嵌套递归函数
def 递归函数(参数列表):
if num != 阈值:
返回值 = 递归函数(参数列表)
if num == 阈值:
return 返回值
num = 0
##用来计数
while(判断终止条件):
返回值 = 递归函数名(参数列表)
num = 0
大致思想如上述所示,详细内容附代码
本文以动态建树的过程为例,进行讲解(在写这个结构的时候,我是先把判断条件放在上面,一直递归调用,直至达到阈值)
def lili(list_now,num,limit):
if len(list_now) != 0:
if num != limit:
num += 1
Node = list_now.popleft()
if len(Node.all) != 0:
all = Node.all
for every in all:
child_node = expand(every)
list_now.append(child_node)
list_now,num = lili(list_now,num,limit)
if num == limit:
return list_now,num
if len(list_now) == 0:
return list_now,num
if __name__ == '__main__':
num = 0
limit = 3
while(len(list_now) != 0):
list_now,num = lili(list_now,num)
num = 0
其中有部分代码没有贴出,主体部分可以换成大家想完成的。
我写的主体部分,主要是为了完成n个数的有序排列组合,也就是n!
(三)感想
这是我写的第一篇文章,基础知识还不扎实,有的地方写的不对希望小伙伴们多多指出不足哦!希望大家共同进步,有好的学习资源大家分享一下呀,我的主要研究方向是人工智能,具体点的话是博弈、深度强化学习等。