2017-06-05 121 views
1

开始学习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)) 
+0

适合我(一旦缩进是固定的)。 – 101

+0

你的输出值是多少? – Sivabushan

+2

你试图得到什么输出?您必须向我们显示您的预期输出才能完成此问题。 – abccd

回答

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)

1

您可以增加允许的堆栈深度 - 这一点,更深层次的递归调用将成为可能,这样的:

import sys 
sys.setrecursionlimit(10000) # 10000 is an example, try with different values 

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