解决python递归函数及递归次数受到限制的问题

目录
  • 递归函数及递归次数受到限制
    • 求和:sum=n+n(n-1)+…+1
    • 求阶乘:n!=1x2x3…xn
    • 解决问题的办法是修改可递归的次数
  • 如何控制递归的次数
    • 第一种
    • 第二种
    • 第三种

递归函数及递归次数受到限制

一个函数在内部调用自己,那么这个函数是递归函数。递归会反复使用本身,每递归一次,越接近最终的值。当一个问题可以由许多相似的小问题解决, 可以考虑使用递归函数。随着递归的深入,问题规模相比上次都应所减小。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的值判断当前的递归层数,可以在递归结束时,在最外层执行完之前做其他事情,一举两得。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • python递归函数求n的阶乘,优缺点及递归次数设置方式

    递归函数两大特点: 1.能够调用函数自身 2.至少有一个出口(结束函数自身调用) 函数实现: def calnum(num): if num != 1: # 递归调用自身函数 csum = num * calnum(num - 1) else: # 设置递归出口 csum = 1 return csum ret = calnum(5) print(ret) 递归函数的缺点: 占用资源多,一般不会优先选择. 一个程序中python默认只允许调用自身1024次,超过这个次数, python解释器会认

  • 详解python中递归函数

    函数执行流程 def foo1(b,b1=3): print("foo1 called",b,b1) def foo2(c): foo3(c) print("foo2 called",c) def foo3(d): print("foo3 called",d) def main(): print("main called") foo1(100,101) foo2(200) print("main ending &qu

  • 讲解Python中的递归函数

    在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 举个例子,我们来计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact(n)表示,可以看出: fact(n) = n! = 1 x 2 x 3 x ... x (n-1) x n = (n-1)! x n = fact(n-1) x n 所以,fact(n)可以表示为n x fact(n-1),只有n=1时需要特殊处理. 于是,fact(n)用递归的方式写出来就是: def fact(n):

  • 解决python递归函数及递归次数受到限制的问题

    目录 递归函数及递归次数受到限制 求和:sum=n+n(n-1)+…+1 求阶乘:n!=1x2x3…xn 解决问题的办法是修改可递归的次数 如何控制递归的次数 第一种 第二种 第三种 递归函数及递归次数受到限制 一个函数在内部调用自己,那么这个函数是递归函数.递归会反复使用本身,每递归一次,越接近最终的值.当一个问题可以由许多相似的小问题解决, 可以考虑使用递归函数.随着递归的深入,问题规模相比上次都应所减小.return函数本身的方法保证了递归的持续进行,但是如果没有明确的结束条件,递归会无限

  • python基于右递归解决八皇后问题的方法

    本文实例讲述了python基于右递归解决八皇后问题的方法.分享给大家供大家参考.具体分析如下: 凡是线性回溯都可以归结为右递归的形式,也即是二叉树,因此对于只要求一个解的问题,采用右递归实现的程序要比回溯法要优美的多. def Test(queen,n): '''这个就不用说了吧,就是检验第n(下标,0-7)行皇后的位置是否合理''' q=queen[n] for i in xrange(n): if queen[i]==q or queen[i]-q==n-i or queen[i]-q==i

  • Python递归函数定义与用法示例

    本文实例讲述了Python递归函数定义与用法.分享给大家供大家参考,具体如下: 递归函数 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 举个例子,我们来计算阶乘 n! = 1 * 2 * 3 * ... * n,用函数 fact(n)表示,可以看出: fact(n) = n! = 1 * 2 * 3 * ... * (n-1) * n = (n-1)! * n = fact(n-1) * n 所以,fact(n)可以表示为 n * fact(n-1),只有

  • Python递归函数 二分查找算法实现解析

    一.初始递归 递归函数:在一个函数里在调用这个函数本身. 递归的最大深度:998 正如你们刚刚看到的,递归函数如果不受到外力的阻止会一直执行下去.但是我们之前已经说过关于函数调用的问题,每一次函数调用都会产生一个属于它自己的名称空间,如果一直调用下去,就会造成名称空间占用太多内存的问题,于是python为了杜绝此类现象,强制的将递归层数控制在了997(只要997!你买不了吃亏,买不了上当...). 拿什么来证明这个"998理论"呢?这里我们可以做一个实验: def foo(n): pr

  • Python数据结构之递归可视化详解

    目录 1.学习目标 2.递归的调用 3.递归可视化 3.1 turtle 库简介 3.1 递归绘图 1.学习目标 递归函数是直接调用自己或通过一系列语句间接调用自己的函数.递归在程序设计有着举足轻重的作用,在很多情况下,借助递归可以优雅的解决问题.虽然使用递归可以快速的解决一些难题,但由于递归的抽象性,使递归难以掌握.为了更好的理解递归函数背后的思想,本节主要通过可视化方式来了解递归函数的执行步骤. 通过本节学习,应掌握以下内容: 提高对递归的理解 利用可视化理解递归函数背后的思想 2.递归的调

  • Python 递归函数详解及实例

    Python 递归函数 如果一个函数体直接或者间接调用自己,那么这个函数就称为递归函数.也就是说,递归函数体的执行过程中可能会返回去再次调用该函数.在python里,递归函数不需要任何特殊的语法,但是它需要付出一定的努力去理解和创建. 我们会以一个简单的例子开始:写一个函数求一个自然数中所有数字的和.在设计递归函数的时候,我们会寻找能把问题分解成简单的问题的方法.在这道题中,运算符%和//可以用来把一个数分成两部分:最低位和不包含最低位数字两部分. 18117的数字和为:1+8+1+1+7=18

  • 分析python动态规划的递归、非递归实现

    概要 本文只是简单的介绍动态规划递归.非递归算法实现 案例一 题目一:求数组非相邻最大和 [题目描述] 在一个数组arr中,找出一组不相邻的数字,使得最后的和最大. [示例输入] arr=1 2 4 1 7 8 3 [示例输出] 15 from functools import wraps def memoDeco(func): ''' memoDeco主要是缓存已遍历的节点,减少递归内存开销 ''' cashe={} @wraps(func) def wrapper(*args): if ar

  • 解决python os.mkdir创建目录失败的问题

    起因 今天使用 python os.mkdir创建目录时遇到的一个小问题: feature_dir = os.path.join(os.getcwd(), 'system', 'feature') if not os.path.exists(feature_dir): os.mkdir(feature_dir) 结果提示错误: OSError: [Errno 2] No such file or directory: '/home/hyb/hyb_speech/2_word/applicatio

  • Python递归函数实例讲解

    Python递归函数实例 1.打开Python开发工具IDLE,新建'递归.py'文件,并写代码如下: def digui(n): if n == 0 : print ('') return print ('*'*n) digui(n-1) if __name__ == '__main__': digui(5) 这里递归打印*号,先打印后递归 2.F5运行程序,打印内容如下: ***** **** *** ** * 3.更改一下打印和递归的 顺序,先递归后打印,代码如下: def digui(n

随机推荐