【问题标题】: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))

【问题讨论】:

  • 为我工作(一旦缩进固定)。
  • 你得到的输出值是多少?
  • 你想得到什么输出?您必须向我们展示您的预期输出才能完成此问题。

标签: python algorithm python-3.x divide-and-conquer


【解决方案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
    

    ...但我建议您首先尝试优化您的代码,例如,使用迭代而不是递归。

    【讨论】:

      猜你喜欢
      • 2013-11-30
      • 2019-03-23
      • 1970-01-01
      • 2022-08-07
      • 2022-01-22
      • 2020-03-14
      • 1970-01-01
      • 2019-01-21
      • 2020-04-01
      相关资源
      最近更新 更多