2014-02-04 4 views
1

Скажем, у меня есть список х = [1, 2, 3, 4]Рекурсивные происходит через список (питон)

Есть рекурсивный метод, где я могу пройти через список, чтобы найти значение?

Я хочу, в конечном счете, иметь возможность сравнить возвращаемое значение в списке (или вложенном списке) на произвольное число, чтобы увидеть его соответствие.

Я могу думать, как это сделать, используя цикл for, но мне трудно представить, как рекурсивный метод выполняет то же самое. Я знаю, что я не могу установить счетчик, чтобы отслеживать свою позицию в списке, потому что вызов функции рекурсивно будет просто сбрасывать счетчик каждый раз.

Я думал, что я мог бы установить мой базовый случай функции как сравнение между номером и списком Len 1.

Я просто хочу некоторые намеки на самом деле.

+3

'num in x'? Что в этом плохого? – squiguy

+0

(вы можете передать счетчик вместе со списком тоже) – njzk2

ответ

1

Это не способ сделать вещи в Python, но верно - вы можете пройти список списков рекурсивно:

def findList(lst, ele): 
    if not lst:   # base case: the list is empty 
     return False 
    elif lst[0] == ele: # check if current element is the one we're looking 
     return True 
    elif not isinstance(lst[0], list): # if current element is not a list 
     return findList(lst[1:], ele) 
    else:        # if current element is a list 
     return findList(lst[0], ele) or findList(lst[1:], ele) 
+0

это работает - может видеть, что рекурсия работает, когда я нарезаю «верх» списка из когда-либо: Я пытаюсь применить это к вложенным спискам, и это не работает. Я добавил оператор elif, который вызывает функцию в подсписке, если один из элементов в списке найден как список типов. и функция не работает над более глубокими списками. – user3272601

0

Рекурсивные функции идиоматических когда у вас есть связанный список. Списки Python больше похожи на массивы. Но по-прежнему можно обрабатывать список Python с рекурсивной функцией - нет никакой реальной утилиты, но это может быть интересно как упражнение.

Вы начинаете с полного списка, а ваш базовый регистр - когда список пуст. Пройдите список, передав список в качестве аргумента, используя x.pop(), чтобы одновременно извлекать и удалять первый элемент в списке, оценивать всплывающий элемент и затем передавать список (теперь короче) в ту же функцию.

Редактировать: на самом деле, с другой стороны, вам лучше не использовать x.pop() и вместо этого заглянуть в первое значение и передать остаток в срезе. Это было бы крайне неэффективно, потому что вы копируете список каждый раз, когда вы нарезаете, но это лучше, чем разрушительно использовать список внутри вашей рекурсивной функции, если только это не будет желательным побочным эффектом.

0

Ну вы будете иметь два базовых случая:

1) Вы достигли конца списка => возвращающих ложь.

2) Ваш текущий элемент - это тот элемент, который вы ищете => return true (или элемент или его положение, независимо от того, что вас интересует).

Вещь, которую вы должны делать все время, - это проверить оба базовых блока на текущем элементе и применить функцию рекурсивно к следующему элементу в списке, если ни один из базовых случаев не применяется.

Смежные вопросы