Python中使用分数时出现内存错误

Python中使用分数时出现内存错误,python,python-3.x,fractions,Python,Python 3.x,Fractions,我使用stern brocot序列生成分数。这些分数已附加到列表中。现在我需要修改这个分数列表,因为问题需要我满足列表中分数的2个条件 1对于列表中存在的每个简化分数a/b,b/2a也必须存在 2对于每2个简化分数a/b和c/d,a+b/c+d 也应该在场 我写了以下代码就是为了做到这一点 # Python program to print # Brocot Sequence from fractions import Fraction import math class MyFracti

我使用stern brocot序列生成分数。这些分数已附加到列表中。现在我需要修改这个分数列表,因为问题需要我满足列表中分数的2个条件

1对于列表中存在的每个简化分数a/b,b/2a也必须存在

2对于每2个简化分数a/b和c/d,a+b/c+d 也应该在场

我写了以下代码就是为了做到这一点

# Python program to print 
# Brocot Sequence
from fractions import Fraction

import math

class MyFraction:  # This class has been defined to return unsimplified fractions as they are as the'd get simplified using the fractions module
    def __init__(self, numerator=1, denominator=1):
        self.numerator = numerator
        self.denominator = denominator

    def get_fraction(self):
        return Fraction(numerator=self.numerator, denominator=self.denominator)

    def __repr__(self):
        return '{}/{}'.format(self.numerator, self.denominator)


def SternSequenceFunc(BrocotSequence, n):

    # loop to create sequence
    for i in range(1, n):

        considered_element = BrocotSequence[i]
        precedent = BrocotSequence[i-1]

        # adding sum of considered
        # element and it's precedent
        BrocotSequence.append(considered_element + precedent)

        # adding next considered element
        BrocotSequence.append(considered_element)


    # printing sequence..
     for i in range(0, n):
        print(BrocotSequence[i] , end=" ")

     print("\n")

# Function to determine if a fraction is simplified or not

def is_simplified(frac):

    if frac == Fraction(frac.numerator, frac.denominator):

        return True

    else:

        return False

# Function to modify the set to satisfy the given conditions

def modify_set(list_fractions):

    # To satisfy the 1st condition
    for fraction in list_fractions:
        numerator = fraction.numerator
        denominator = fraction.denominator
        list_fractions.append(MyFraction(denominator, 2*numerator))

    # To satisfy the 2nd condition
    for fraction in list_fractions:
        if is_simplified(fraction):
            for frac in list_fractions:
                if frac != fraction:
                    if is_simplified(frac):
                        f = MyFraction((fraction.numerator+frac.numerator), (fraction.denominator+frac.denominator))
                        list_S.append(f)

while True: 

    list_S = []

    count = 0
    # Driver code
    n = int(input("Enter value of n : "))
    BrocotSequence = []

    # adding first two element
    # in the sequence
    BrocotSequence.append(1)
    BrocotSequence.append(1)

    SternSequenceFunc(BrocotSequence, n)

    for i in range(1, n):
        list_S.append(Fraction(BrocotSequence[i], BrocotSequence[i-1])) # Appending the list with fractions generated from stern-brocot sequence

    modify_set(list_S)

    print("\n Printing all fractions : \n")
    for fraction in list_S:
        count = count + 1
        print("\n", fraction)

    print("Number of fractions: {}".format(count))
运行此代码后,在运行modify_set函数时出现内存错误。我不明白为什么。有人能帮我理解为什么以及如何解决这个问题吗

提前感谢。

在此处迭代列表时,您正在将其添加到列表中:

for fraction in list_fractions:
    numerator = fraction.numerator
    denominator = fraction.denominator
    list_fractions.append(MyFraction(denominator, 2*numerator))
每次从列表中提取一个元素,然后添加一个新的元素,该元素最终将依次迭代。所以这个循环永远不会结束,列表会永远增长,或者直到内存错误出现

类似地,在该函数的下一个循环中,你将得到一个嵌套的循环,它位于list_分数上,虽然在这里不太明显,但它也是无限的,因为每次迭代都会附加到list_,它是一个全局的,作为list_分数参数传递,因此,它们都是同一列表的别名。Python函数调用不复制其参数的内容,只复制引用本身,因此,除了将列表分数重新绑定到新对象之外,任何东西都会修改列表

我不知道您的预期逻辑,但如果目标是只为现有条目添加新条目,而不处理添加的条目,则解决方案是迭代列表的浅副本,例如:


嵌套循环将更加复杂,这取决于内部循环是否应处理列表分数的更新副本;我让你来决定正确的行动路线。

你有没有打破while-True循环?Stern Brocot树是无限的。您是否试图进行无限量的计算?编译时出错?或者在运行函数时?我从用户那里接受一个整数值,序列中将有那么多的迭代。所以,在我的情况下,它不是无限的。@freeractive:你传递了什么值?明白了,谢谢@ShadowRanger。
# list_fractions[:] returns a new list with references to the same values as
# the original list, but unaffected by subsequent additions and removals
for fraction in list_fractions[:]:
    numerator = fraction.numerator
    denominator = fraction.denominator
    list_fractions.append(MyFraction(denominator, 2*numerator))