我正在研究需要递归调用的东西。更大的应用程序崩溃了。在尽量减少问题的同时,我遇到了一个相当奇怪的现象。
考虑以下代码:
def merge(A, s, m, e):
left = A[s:m+1]
right = A[m+1:e+1]
i = 0
j = 0
k = s
while(i < len(left) and j < len(right)):
if left[i] < right[j]:
A[k] = left[i]
k+=1
i+=1
else:
A[k] = right[j]
k+=1
j+=1
while i < len(left):
A[k] = left[i]
k+=1
i+=1
while j < len(right):
A[k] = right[j]
k+=1
j+=1
return A
def mergesort(A, s, e):
if(s < e):
m = s + (e-s)/2
mergesort(A, s, m)
mergesort(A, m+1, e)
merge(A, s, m, e)
return A
A = [5, 3, 8, 0]
print('original')
print(A)
A = mergesort(A, 0, len(A)-1)
print('sorted:')
print(A)
当我运行此代码时,我得到RecursionError: maximum recursion depth exceeded in comparison
,
但如果我转到pdb
查看错误,它会正确终止。
sorted:
[0, 3, 5, 8]
The program finished and will be restarted
这是否意味着pdb在启动时会更改堆栈溢出限制?为什么?这不会对正在发生的事情做出错误的解释吗?
另外,对于这段代码,具体来说,递归不是那么深,为什么首先达到限制?
答案 0 :(得分:2)
当调试器本身因任何原因无法使用时,您拥有最古老,最古老,最可靠且经过时间验证的调试技术:调试打印。
E.g。使函数报告递归深度:
def merge(A, s, m, e, r):
print("merge: %d"%r)
<...>
def mergesort(A, s, e, r=0):
print("mergesort: %d"%r)
<...>
mergesort(A, s, m, r+1)
mergesort(A, m+1, e, r+1)
merge(A, s, m, e, r+1)
<...>
如果您想知道哪些更改,请使用和不使用调试器比较输出。或者只是错误的输出来诊断问题 - 无论你认为哪个是对你的时间的更好投资。