2012-12-16 2 views
3

J'essaye d'écrire une fonction qui est supposée comparer des structures de liste (les valeurs sont indifférentes). Le problème est que j'ai deux listes qui sont inégales mais la fonction renvoie toujours True même si elle va effectivement dans la partie else. Je ne comprends pas pourquoi et ce que j'ai fait de mal. Voici mon code:La fonction ne s'arrête pas après "return (False)"

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 

Le problème se produit uniquement avec le troisième print(ListeIsomorf(ListeD,ListeG)) # False. Il va en fait dans la partie else et imprime le "length from the list isn't equal" mais il ne s'arrête pas et il ne donne pas le return(False). Est-ce que je manque quelque chose?

+3

Bienvenue dans Stackoverflow! Veuillez corriger votre indentation (je suppose que le bloc 'else' est en retrait) –

+1

+1, veuillez utiliser le lien [modifier] pour corriger l'indentation. –

+1

Veuillez utiliser 'isinstance (p, list)' - il vaut mieux sur tellement de termes :) –

Répondre

8

Le problème est que lorsque votre fonction elle-même appelle récursive:

  ListeIsomorf(i,j) 

il ne tient pas compte de la valeur retournée.

Ainsi, les comparaisons qui ont lieu au deuxième niveau de récursion n'ont aucun effet sur ce que le niveau supérieur renvoie.

Modification du dessus:

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

résout le problème.

+0

Super merci! Je ne savais pas que la fonction récursive ignore la valeur, bon à savoir, merci beaucoup! – Linalein

Questions connexes