如何解决递归爆栈问题(无限制递归)

(一)问题描述

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!

(三)感想

这是我写的第一篇文章,基础知识还不扎实,有的地方写的不对希望小伙伴们多多指出不足哦!希望大家共同进步,有好的学习资源大家分享一下呀,我的主要研究方向是人工智能,具体点的话是博弈、深度强化学习等。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值