J'essaye d'écrire une fonction récursive de Python 3 qui me dira si un entier est dans une liste imbriquée. Je ne suis pas sûr comment je peux rendre mon code retourner True
s'il le trouve dans la liste, et False
s'il ne le trouve pas dans la liste. Lorsque j'imprime le résultat de ma boucle, je reçois un tas deRécursivité Python, comment se fait-il que ma fonction ne fonctionne pas?
false
false
false
false
true
false
false
false
etc. Mais, il retourne faux parce que le dernier appel était faux, même si je veux qu'il revienne vrai. Comment puis-je réparer cela?
Voici mon code:
def nestedListContains(NL, target):
if(isinstance(NL, int)):
return NL
for i in range(0, len(NL)):
return (nestedListContains(NL[i], target) == target)
return False
Et voici comment je l'appeler
print(nestedListContains([[3], [4,5,7], [[[8]]]], 8))
EDIT: Cela semble fonctionner pour moi, mais il semble plutôt ghetto:
def nestedListContains(NL, target):
if(isinstance(NL, int)):
if(NL == target):
return 1
return 0
x = 0
for n in NL:
x += nestedListContains(n, target) == 1
return x != 0
Outre le problème récurrent, votre scénario de base semble erroné. Quand vous descendez à un 'int', au lieu de retourner true si elle est égale à la cible, vous renvoyez le' int' lui-même. Cela signifie qu'en fin de compte, vous retournerez true s'il y a des éléments non-zéro dans la liste, false sinon. – abarnert
Vous pourriez également vouloir penser à la robustesse ici. Si NL contient des non-séquences non-int, cela déclenchera un 'TypeError', ce qui est probablement bien, mais s'il contient des chaînes, il ira dans la récursion infinie (qui finira par déclencher une exception quand il frappe le limite), ce qui peut ne pas être bon. – abarnert
Aussi: Pourquoi ne pas simplement supprimer la vérification 'int', et faire juste' si NL == target: return True'? Si 'target' est toujours un' int', cela aura exactement le même effet. Mais il vous permet de rechercher d'autres types (y compris des objets qui peuvent être égaux à un 'int' mais n'en sont pas un). Et c'est plus simple. – abarnert