【发布时间】: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 好的,所以也许通过循环运行它会更好,呵呵。我只是用一个循环来测试它,它更简单并且有效!谢谢大卫!