解决python递归函数及递归次数受到限制的问题
作者:LLLLLLLLLLLLIU 发布时间:2023-12-01 01:49:35
递归函数及递归次数受到限制
一个函数在内部调用自己,那么这个函数是递归函数。递归会反复使用本身,每递归一次,越接近最终的值。当一个问题可以由许多相似的小问题解决, 可以考虑使用递归函数。随着递归的深入,问题规模相比上次都应所减小。return函数本身的方法保证了递归的持续进行,但是如果没有明确的结束条件,递归会无限进行下去。所以当已经到了问题解决的程度, 应该告诉函数结束递归,这就需要明确的结束条件。
常见的两个递归例子:求和、求阶乘n!
求和:sum=n+n(n-1)+…+1
def sum(n):
if n > 0:
return n+sum(n-1)
else:
return 0
new_sum = sum(10)
print(new_sum)
#output
55
求阶乘:n!=1x2x3…xn
def factorial(n):
if n == 1:
return 1
else:
return n*factorial(n-1)
new_sum = factorial(5)
print(new_sum)
#output
120
使用递归函数需要注意递归次数默认限制为1000,如果递归次数较多会导致栈溢出的问题
比如
def sum(n):
if n > 0:
return 1+sum(n-1)
else:
return 0
new_sum = sum(1000)
print(new_sum)
会报RecursionError: maximum recursion depth exceeded in comparison的错误
解决问题的办法是修改可递归的次数
import sys
sys.setrecursionlimit(1500)#可递归次数修改为1500
def sum(n):
if n > 0:
return 1+sum(n-1)
else:
return 0
new_sum = sum(1000)
print(new_sum)
#output
1000
修改递归次数时需要注意,修改可递归次数为1500,递归深度到不了1500,在1400左右。默认可递归次数为1000,递归深度也到不了1000,到992左右
如何控制递归的次数
经常会用到递归,虽然能解决很多问题,但其缺点很明显,有可能无法跳出造成死循环,能控制递归次数就可以避免这种情况。
用lua尝试了几种方法,
第一种
在方法内定义一个变量计数:
function recursionTest()
local times = 0
if times < 10 then
times = times + 1
recursionTest()
end
if times == 0 then
print("outer round")
end
end
执行下来,是无法限制的,因为局部变量每次都会重置为0。
第二种
local recurTimes = 0
function recursionTest2()
if recurTimes < 10 then
recurTimes = recurTimes + 1
recursionTest2()
end
end
这种方法可以控制次数,但是变量需要定义在方法体外,执行函数前都需要先把这个变量设为0,需要在递归方法外包一层,比较繁琐。
第三种
function recursion(str, t)
str = str or "first time "
t = t or 0
t = t + 1
print(str, t)
if t < 10 then
recursion("times:", t)
end
if t == 1 then
print("outer round")
end
end
在递归时传入一个自增变量,达到阈值时停止递归,执行最外层时无需传参,默认值为0,且可根据t的值判断当前的递归层数,可以在递归结束时,在最外层执行完之前做其他事情,一举两得。
来源:https://blog.csdn.net/weixin_44851971/article/details/106678010


猜你喜欢
- 前言最近微信小游戏跳一跳大热,自己也是中毒颇久,无奈手残最高分只拿到200分。无意间看到教你用Python来玩微信跳一跳一文,在电脑上利用a
- 世上无难事,只要找到 Homebrew 的正确安装方式。Homebrew 是什么Homebrew是 mac的包管理器,仅需执行相应的命令,就
- Series 的 sort_index(ascending=True) 方法可以对 index 进行排序操作,ascending 参数用于控
- 冒泡的表现近期用vue做了一个需求,大概是同一个区域,点击不同位置有不同的响应函数,还有个总的响应函数,好吧,如下图所示:他们的DOM结构如
- 一.用SqlConnection连接SQL Server 1..加入命名空间 using System.Data.Sql
- 直接po截图和代码下面是CheckFormDemo.html<!DOCTYPE html><html><hea
- 前言传统 Web 开发方式常常需要编写繁琐乏味的重复性代码,不仅页面表现与逻辑实现的代码混杂在一起,而且代码编写效率不高。对于开
- 一、定义与作用主键:表中能够唯一地辨别事物的属性。通过主键能够查询出表中一条完整的记录,同时使用主键能防止表中出现重复的记录,避免了数据的冗
- 环境准备好了!我们怎么使用这些东东?IIS用组件初始化是用这个过程Public Sub OnStartPage给个使用asp组件的例子:数字
- 前言在企业实际应用中,成熟的业务通常数据量都比较大,而单台MySQL服务器在安全性、高可用性和高并发方面都无法满足实际的需求,我们可以在多台
- 代码如下_init_.pyfrom flask import Flask, request, url_for, redirect, rend
- 下面为大家举一个例子,请按照下面的步骤: (1)从http://home.gbsource.net/xuankong/dll.z
- SQLSERVER编译与重编译编译的含义当SQLSERVER收到任何一个指令,包括查询(query)、批处理(batch)、存储过程、触发器
- 1、配置安装源# 安装dnf install http://mirrors.ustc.edu.cn/mysql-repo/mysql80-c
- 基于 Vue 技术栈的你如果需要选用一种移动端跨平台框架,是 Weex?React-Native?还是Flutter? 无疑,相对于后两者,
- 一、环境配置安装 Python请确保您已经安装了 Python 3.x。可以在Python 官网下载并安装。安装所需库在命令提示符或终端中运
- EasyUI 简介easyui是一种基于jQuery的用户界面插件集合。easyui为创建现代化,互动,JavaScript应用程序,提供必
- 本文实例讲述了Python解决鸡兔同笼问题的方法,分享给大家供大家参考。具体分析如下:问题描述一个笼子里面关了鸡和兔子(鸡有 2 只脚,兔子
- 本文通过实例介绍了MySQL中的group_concat函数的使用方法,比如select group_concat(name) 。 MySQ
- 原问题是这样的:如何用SQL语句(不是Oracle),求出下表每一行的5个字段中的最大值,最后生成一个新字段。例如:第一行最大值 -5.0