今天我正在解决有关Hacker-Rank的问题:糖果。 我尝试了一种递归算法。 除了一个以外,所有测试用例都通过其中显示运行时错误。所以我下载了输入文件并在我的代码上运行它。
import sys
sys.setrecursionlimit(10000000)
# Enter your code here. Read input from STDIN. Print output to STDOUT
class Node :
def __init__(self,imp):
self.value = 0
self.imp = imp
self.left = self.right = None
def get_val(self) :
#print self.imp
if self.value != 0 :
return
if not self.right and not self.left :
self.value = 1
return
if not self.left :
if self.right.imp >= self.imp :
self.value = 1
else :
self.right.get_val()
self.value = self.right.value + 1
return
if not self.right :
if self.left.imp >= self.imp :
self.value = 1
else :
self.value = self.left.value + 1
return
else :
if self.left.imp == self.imp :
if self.right.imp >= self.imp :
self.value = 1
else :
self.right.get_val()
self.value = self.right.value + 1
elif self.right.imp == self.imp :
if self.left.imp > self.imp :
self.value =1
else :
self.value = self.left.value +1
elif self.left.imp > self.imp <self.right.imp :
self.value = 1
elif self.left.imp < self.imp <self.right.imp :
self.value = self.left.value +1
elif self.left.imp > self.imp >self.right.imp :
self.right.get_val()
self.value = self.right.value +1
elif self.left.imp < self.imp > self.right.imp :
self.right.get_val()
if self.left.value > self.right.value :
self.value = self.left.value +1
else :
self.value = self.right.value +1
with open("input",'r') as textfile :
a = int(textfile.readline().strip())
start = Node(int(textfile.readline().strip()))
temp1 = start
for i in range(a -1 ) :
temp = Node(int(textfile.readline().strip()))
temp1.right = temp
temp.left = temp1
temp1 = temp
temp1 = start
for i in range(a) :
print temp1.imp,i
temp1.get_val()
temp1 = temp1.right
print "done"
temp1 = start
toffee = 0
for i in range (a) :
#print temp1.value
toffee += temp1.value
temp1 = temp1.right
print toffee
输入文件的第一个条目为100000,然后是100000 no.s,从1到100,000。 当我第一次从我的PC运行输入文件时,它给出了最大的递归dept错误。所以我在顶部添加了代码,使递归限制为100000,因为如果它完全运行的话,我的程序就已经采用了最大的递归深度。但是我遇到了这个错误
Segmentation fault (core dumped)
为了确切了解这种情况发生的原因,我在第10行的代码中添加了注释掉的print语句(这基本上可以告诉那个时候递归调用的位置)。输出是从100000到75064的一系列no.s 然后是分段错误。
算法的鸟瞰图是Node(100000).get_val()将调用Node(99999).get_val(),它将依次调用Node(99998).get_val()等等。
因此我的猜测是在100000 - 75064之后调用内存限制并且它无法再生成节点并因此调用分段错误。但我读到python没有内存上限。那为什么会发生这种情况?!!
聚苯乙烯。我可以在我的代码上进行大量改进,使其更快,占用更少的内存,但这是我第一次在python中遇到分段错误,并且真的想知道它为什么会发生。我之前在C ++中处理过分段错误。但与他们相比,这个人似乎真的远离了联盟!!
此外,我的代码以较低的顺序完美地运行较小的输入。只有当我增加输入量时才会发生这种情况。