2017-06-05 119 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 

...但是我建議你首先嚐試優化你的代碼,例如,使用迭代而不是遞歸。