【问题标题】:Python recursion length too long?Python递归长度太长?
【发布时间】:2015-03-24 15:43:24
【问题描述】:

我正在处理一个 checkio.org 问题,并且我已经构建了一个使用递归的解决方案,除非它在第 8 次测试运行时出现此错误:

RuntimeError: maximum recursion depth exceeded while calling a Python object, count_gold, 16, count_gold, 29, count_gold, 29, count_gold, 29, count_gold, 29, count_gold, 29, count_gold, 29, count_gold, 29, count_gold, 29, count_gold, 29, count_gold, 29, count_gold, 29, count_gold, 29, count_gold, 29, count_gold, 29, count_gold, 29, count_gold, 29, count_gold, 29, count_gold, 29, count_gold, 29, count_gold, 29, count_gold, 29,

我截断了结尾,但它会持续很长时间。我认为这是我对递归工作方式的基本误解。最初我非常不愿意发布我的代码,因为我不想给出答案,但我认为如果我不链接问题,那么我的代码只会在默默无闻中丢失。所以我们开始:

def mystery_function(pyramid, perm=0, lastmax=0, result = [], running=False):

    if not running:
        result = []

    bitstr = bin(perm).zfill(len(pyramid)+1)
    bitstr = bitstr.replace("b","")

    j, newmax = 0, 0

    for i in range(len(pyramid)):

        j += int(bitstr[i])
        newmax += pyramid[i][j]

    maxpermute = "1"*(len(pyramid))
    result.append(newmax)

    if newmax < lastmax:
        nextmax = lastmax
    else:
        nextmax = newmax

    if perm < int(maxpermute,2):
        mystery_function(pyramid, perm+1, nextmax, result, True)

    return max(result)

所以就像我说的,我认为问题在于我只是不完全理解递归。我读了这篇文章:Python RuntimeError: maximum recursion depth exceeded 但它似乎并不适用,因为我的递归将分解为基本情况并停止。

有什么想法吗?对于那些感兴趣的人(并且根据我的函数知道问题),递归在测试 8 中失败。

注意:在函数中,“pyramid”是一个长度在 1 到 20 个元组之间的元组。我们应该穿过“金字塔”找到产生最大总和的路径并返回该总和

【问题讨论】:

  • 关于递归的简短说明:即使您的代码最终可以证明达到基本情况,也完全有可能超过最大递归深度。毕竟,计算机内存是有限的。
  • 如果你开始使用递归,它通常有助于首先解决问题的一小部分......比如说,你的树/金字塔的前两层或三层。如果您试图找到 最大 和,则可能无法避免遍历整棵树。因此,不必担心(还)进行检查,而只需构建一个显示每个可能路径总和的解决方案。先分解问题,再优化。
  • 我不认为这是这里的问题,但要非常小心地创建一个默认 arg 为 [] 的函数,这是新 python 程序员的常见问题:stackoverflow.com/questions/1132941/…
  • @Apc0243,最大递归深度在 1000 左右。 2^20 个元素的字节数组只有 1 MiB,对于现代 RAM 来说绝对不是问题。 (当然,Python 对象列表会占用更多内存,但考虑简单数组是一个有用的基准)。
  • @DavidCain 好的,所以也许通过循环运行它会更好,呵呵。我只是用一个循环来测试它,它更简单并且有效!谢谢大卫!

标签: python recursion


【解决方案1】:

试试这个:

import sys
sys.setrecursionlimit(5000)

我相信 Python 的限制是 1000

【讨论】:

    猜你喜欢
    • 2011-08-05
    • 2017-06-06
    • 1970-01-01
    • 2014-03-28
    • 1970-01-01
    • 2011-08-07
    • 2019-10-29
    • 1970-01-01
    • 2018-02-19
    相关资源
    最近更新 更多