比较超过最大递归深度?
Posted
技术标签:
【中文标题】比较超过最大递归深度?【英文标题】:maximum recursion depth exceeded in comparison? 【发布时间】:2017-11-05 17:46:54 【问题描述】:开始学习python,这是我尝试过的最大和子数组。以“比较超过最大递归深度”结束。我的算法对我来说似乎没问题。如果我做错了什么,请帮助我。
import sys
import math
def maxtuple(lss,rss):
if lss[2] > rss[2]:
return lss
else:
return rss
def crosssubarray(A, start, mid, end):
ls=rs=-sys.maxsize
maxleft=0
maxright=0
sum = 0;
for i in reversed(range(start, mid)):
sum = sum + A[i]
print(i)
if sum > ls:
ls = sum
maxleft = i
sum = 0
for i in range(mid+1, end):
sum = sum+ A[i]
if sum > rs:
rs = sum
maxright = i
return (maxleft, maxright, ls+rs)
def maxsubarray(A,start,end):
if start == end:
return (start,end,A[start])
else:
mid = (start+end)/2
lss = maxsubarray(A, start, mid)
rss = maxsubarray(A, mid+1, end)
css = crosssubarray(A, start, mid, end)
maxsub = maxtuple(lss,rss)
maxall = maxtuple(maxsub, css)
return maxall
A = [13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7]
print(maxsubarray(A,0,15))
【问题讨论】:
为我工作(一旦缩进固定)。 你得到的输出值是多少? 你想得到什么输出?您必须向我们展示您的预期输出才能完成此问题。 【参考方案1】:你的问题出在这个函数上:
def maxsubarray(A,start,end):
if start == end:
return (start,end,A[start])
else:
mid = (start+end)/2
lss = maxsubarray(A, start, mid)
rss = maxsubarray(A, mid+1, end)
css = crosssubarray(A, start, mid, end)
maxsub = maxtuple(lss,rss)
maxall = maxtuple(maxsub, css)
return maxall
准确地说,是前 5 行。在 python 2.x 中“工作”(不知道您的预期结果)的原因是因为 /
用于地板除法,而在 python 3.x 中 /
用于浮点除法。由于浮点舍入错误,start
很可能永远不会等于 end
。
如果您要使用整数下除法,您可以将 /
替换为 //
。
这样做,错误将消失并返回(8, 10, 32)
【讨论】:
【参考方案2】:您可以增加允许的堆栈深度 - 这样,更深的递归调用将成为可能,如下所示:
import sys
sys.setrecursionlimit(10000) # 10000 is an example, try with different values
...但我建议您首先尝试优化您的代码,例如,使用迭代而不是递归。
【讨论】:
以上是关于比较超过最大递归深度?的主要内容,如果未能解决你的问题,请参考以下文章
Binary Search RecursionError:比较超过最大递归深度