0

N*N 行列の行列式を見つけるプログラムを作成しようとしていますが、これが私のコードです。

from copy import deepcopy

n = input()
myMatrix = []

for i in range(n):
    myMatrix.append(raw_input().split())

def findMinor(matrix, i):
    minor = deepcopy(matrix)
    del minor[0]
    for b in range(len(matrix)-1):
        del minor[b][i]
    return minor

def det(matrix):
    determinant = 0
    if len(matrix) == 1:
        determinant = matrix[0][0]
    else:
        for x in range(len(matrix)):
            coFactor = det(findMinor(matrix,x))
            determinant += int(matrix[0][x]) * (-1)**(2+x) * coFactor
            return determinant

print det(myMatrix)

No-Type エラーが発生していますが、それは再帰的なアプローチであるため、関数自体を呼び出しているためだと確信しています。

これを修正する方法はありますか?おそらく2番目の関数をダンプすることさえありますか?

4

1 に答える 1

1

あなたの問題detelseif.. else

の場合len(matrix)==1、何も起こりません (または、少なくとも何も返されません)。そのため、計算の結果である whichn=2を使用しようとすると、 の値はになります。cofactorn=1cofactorNone

その前のインデントを削除して、コードreturn determinantの一部から外します。if.. else..

これを修正した後でも、別の問題が発生します。マトリックスを文字列ではなく多くの浮動小数点数として保存する方がよいでしょう。文字列のままにしたい場合は、determinant=int(matrix[0][0])

文字列の問題を修正する最良の方法は次のとおりだと思います。

for i in range(n):
    myMatrix.append(map(float,raw_input().split()))

そして、実際に行列計算を行いたい場合は、独自のデータ構造を使用しないでください。numpy を使用してください。純粋な python で誰でも作成できるよりも高速です。

于 2015-01-06T05:35:22.833 に答える