Linalein
Linalein

Reputation: 25

Function doesn't stop after "return(False)"

I am trying to write a function which is supposed to compare list structures (the values are indifferent). The problem is that I have two lists which are unequal but the function still returns True even though it actually goes into the else part. I don't understand why and what I did wrong. Here is my code:

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

So the problem only occurs with the third print(ListeIsomorf(ListeD,ListeG)) # False. It actually goes into the else part and does print the "length from the list isn't equal" but it doesn't stop and it doesn't give out the return(False). Am I missing something?

Upvotes: 2

Views: 1659

Answers (1)

NPE
NPE

Reputation: 500327

The problem is that when your function calls itself recursively:

            ListeIsomorf(i,j)

it ignores the returned value.

Thus the comparisons that take place at the second level of recursion have no effect on what the top level returns.

Changing the above to:

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

fixes the problem.

Upvotes: 7

Related Questions