3

リスト構造を比較することになっている関数を書き込もうとしています(値は無関心です)。問題は、等しくない2つのリストがありますが、True実際にはそのelse部分に入ったとしても、関数が返されることです。なぜ、何を間違えたのかわかりません。これが私のコードです:

def islist(p): #is p a list
    return type(p)==type(list())

def ListeIsomorf(a,b):
    if len(a)==len(b):
        for i,j in zip(a,b):
            if islist(i) and islist(j):
                ListeIsomorf(i,j)
            elif islist(i) or islist(j):
                return(False)
        return(True)    

    else:
        print(a,"length from the list isn't equal",b)
        return(False)

#example lists
ListeE = [[],[],[[]]]
ListeD = [[],[],[[]]]
ListeF = [[[],[],[[]]]]
ListeG = [[],[[]],[[]]]
ListeH = [1,[3]]
ListeI = [1,3]

#tests
print(ListeIsomorf(ListeD,ListeE)) # True
print(ListeIsomorf(ListeD,ListeF)) # False
print(ListeIsomorf(ListeD,ListeG)) # False
print(ListeIsomorf(ListeH,ListeI)) # False

したがって、問題は3番目でのみ発生しprint(ListeIsomorf(ListeD,ListeG)) # Falseます。それは実際にelseパーツに入り、印刷します"length from the list isn't equal"が、停止せず、を出力しませんreturn(False)。私は何かが足りないのですか?

4

1 に答える 1

8

問題は、関数が自分自身を再帰的に呼び出す場合です。

            ListeIsomorf(i,j)

戻り値は無視されます。

したがって、再帰の 2 番目のレベルで行われる比較は、最上位レベルが返すものには影響しません。

上記を次のように変更します。

            if not ListeIsomorf(i,j):
                return(False)

問題を修正します。

于 2012-12-16T19:05:02.840 に答える