内存有限会导致python分段错误吗?

时间:2017-05-12 20:32:37

标签: python python-2.7 error-handling segmentation-fault

今天我正在解决有关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 ++中处理过分段错误。但与他们相比,这个人似乎真的远离了联盟!!

此外,我的代码以较低的顺序完美地运行较小的输入。只有当我增加输入量时才会发生这种情况。

0 个答案:

没有答案