鱼C论坛

 找回密码
 立即注册
查看: 1989|回复: 4

学习递归遇到一些问题,请给萌新解答一下

[复制链接]
发表于 2021-7-20 23:51:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 墨墨唧唧爱 于 2021-7-20 23:57 编辑

用递归思想写了个求和的函数

import sys
sys.setrecursionlimit(1000000)
def total(num):
    if num==1:
        return 1
    return num+total(num-1)
   
a=total(1000)
print(a)

运行结果是
2.png


但是当求5000的和时,卡住了:

import sys
sys.setrecursionlimit(1000000)
def total(num):
    if num==1:
        return 1
    return num+total(num-1)
   
a=total(5000)
print(a)

结果:
1.png

我加了个监测点看看每步的情况:

import sys
sys.setrecursionlimit(1000000)
def total(num):
    print(num)
    if num==1:
        return 1
    return num+total(num-1)
   
a=total(1000)
print(a)

当算1000的和时,很正常,结果是这样的:
3.png

但是当算5000时,加到1297卡住了,然后出现了和此前一样的报错,请问这是什么原因?应该怎么解决?我不是已经解除了递归次数限制了?

4.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-7-20 23:52:08 | 显示全部楼层
我加了个监测点看看每步的情况:
import sys
sys.setrecursionlimit(1000000)
def total(num):
   print(num)
   if num==1:
       return 1
   return num+total(num-1)
   
a=total(1000)
print(a)
当算1000的和时,很正常,结果是这样的:

                               
登录/注册后可看大图
但是当算5000时,加到1297卡住了,然后出现了和此前一样的报错,请问这是什么原因?应该怎么解决?我不是已经解除了递归次数限制了?

                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-21 10:28:54 | 显示全部楼层
应该是你调用次数太多, 把调用栈挤满了, 我这里也不输出结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-22 10:47:44 | 显示全部楼层
import sys

class TailRecurseException(BaseException):
    def __init__(self, args, kwargs):
        self.args = args
        self.kwargs = kwargs


def tail_call_optimized(g):
    """
    This function decorates a function with tail call
    optimization. It does this by throwing an exception
    if it is it's own grandparent, and catching such
    exceptions to fake the tail call optimization.

    This function fails if the decorated5
    function recurses in a non-tail context.
    """
    def func(*args, **kwargs):
        f = sys._getframe()
        if f.f_back and f.f_back.f_back and f.f_back.f_back.f_code == f.f_code:
            raise TailRecurseException(args, kwargs)
        else:
            while 1:
                try:
                    return g(*args, **kwargs)
                except TailRecurseException as e:
                    args = e.args
                    kwargs = e.kwargs

    func.__doc__ = g.__doc__
    return func

@tail_call_optimized
def total(num,a=1):
    if num==1:
        return a
    a += num
    return total(num-1,a)
   
a=total(100)
print(a)
a=total(5000)
print(a)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-22 11:05:12 | 显示全部楼层
软件上(代码)可以设置更大乃至无穷,
但硬件上(分配到的内存)总是有限的……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-14 01:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表