0

このコードの抜粋をデバッグできません。実際には作者が望んでいるものを返さないという事実を気にしないでください。私はすでに説明しましたが、私の質問は異なります。

def factors(n):
    result = []
    for x in xrange(2,n):
        print "\t%i,foo" % x
        if n % x == 0:
            isPrime = True
            print "\t\t%i,bar" % x
            for factor in result:
                print "\t\t%i %% %i = %i" % (x,factor,x % factor)
                if x % factor == 0:
                        isPrime = False
                        print "\t\t\t%i,foobar" % x
                        subFactors = factors(x)
                        result.extend(subFactors)
            if isPrime:
                result.append(x)
print ""
return result

def main():
    factor = dict()
    for i in xrange(1,100):
        factor[i] = factors(i)
        factor[i].insert(0,1)
        factor[i].append(i)
        print "%i: %s" % (i,factor[i])

if __name__ == "__main__":
     main()

そのコードは無限ループです!具体的には、以下を繰り返し出力します。

2,foo
    2,bar
3,foo

    4 % 2 = 0
        4,foobar

2 回目の反復では、「bar」print ステートメントは出力されず、値がx「bar」print ステートメントから「mod」print ステートメントに変更されることに注意してください。

この振る舞いを作者に説明することはできません。あなたの親切な人のうちの1人はできますか?

4

1 に答える 1

2

result問題は、その内容を繰り返し処理している間にリストを拡張していることです。以下に 2 つの重要な行を示しますが、その周りに他の気を散らすビットはありません。

for factor in result:
    result.extend(subFactors)

Python 仕様によると、これには未定義の動作があります。それが無限ループの原因だと確信しています。

于 2012-10-15T04:03:03.517 に答える