Я пытаюсь написать рекурсивную функцию Python 3, которая сообщит мне, является ли целое число во вложенном списке. Я не уверен, как я могу вернуть код True
, если он найдет его в списке, и False
, если он не найдет его в списке. Когда я распечатать результат моего для цикла я получаю кучуРекурсия Python, почему моя функция не работает?
false
false
false
false
true
false
false
false
и т.д. Но, она возвращает значение False, потому что последний вызов был ложным, даже если я хочу, чтобы вернуться верно. Как я могу это исправить?
Вот мой код:
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
А вот как я называю это
print(nestedListContains([[3], [4,5,7], [[[8]]]], 8))
EDIT: Это, кажется, работает для меня, но это кажется довольно Гетто:
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
Помимо рекурсивных проблем, ваш базовый случай кажется неправильным. Когда вы переходите к 'int', вместо того, чтобы возвращать true, если он равен цели, вы возвращаете' int'. Это означает, что в конечном итоге вы вернете true, если в списке есть ненулевые элементы, иначе false. – abarnert
Вы также можете подумать о надежности. Если NL содержит любые non-int non-sequence, он поднимет 'TypeError', что, вероятно, прекрасно, но если оно содержит любые строки, оно перейдет в бесконечную рекурсию (которая в конечном итоге вызовет исключение, лимит), что может быть неудобно. – abarnert
Также: Почему бы просто не удалить проверку 'int', а просто« if NL == target: return True »? Если 'target' всегда является' int', это будет иметь тот же эффект. Но он позволяет вам искать другие типы (в том числе объекты, которые могут сравниваться с «int», но не одни). И это проще. – abarnert