2015-04-14 5 views
0

Мне нужно написать рекурсивную функцию для поиска списка для определенного значения. Функция должна определить, будет ли число в списке, и будет ли оно возвращать индекс списка этого значения.Функция поиска рекурсивного списка Python

Например:

search([1,2,3,4,5],3) 

должен вернуться:

2 

как 3 появится в списке индекса 2.

Прямо сейчас у меня есть:

def search(myList, number): 
    if myList[0] == number: 
     return myList[0] 
    return search(myList[1:], number) 

и продолжает возвращать 3 для того же вызов функции у меня был раньше. Любая помощь будет оценена.

+0

Почему вы хотите использовать рекурсию ? List уже предоставляет этот метод 'list.index' – wim

ответ

4

В вашем текущем коде есть 2 ошибки, вы возвращаете номер, а не его индекс, и вы действительно не пропускаете инкрементированный индекс обратно. Таким образом, сделать это вместо:

>>> def search(myList, number): 
...  if myList[0] == number: 
...   return 0 
...  return 1 + search(myList[1:], number) 
... 
>>> search([1,2,3,4,5],3) 
2 

Теперь, когда работает, если у нас есть число в списке, но если нет, то мы получим ошибку индекса.

>>> search([1,2,3,4,5],6) 
IndexError: list index out of range 

Таким образом, мы должны обернуть эту функцию в примерки, за исключением блока

def search(myList, number): 
    def search_recursive(lst, num): 
     if lst[0] == num: 
      return 0 
     return 1 + search_recursive(lst[1:], num) 
    try: return search_recursive(myList, number) 
    except IndexError: return -1 

И теперь он будет работать

>>> search([1,2,3,4,5],6) 
-1 
>>> search([1,2,3,4,5],5) 
4 

Но выше, следует использовать только когда вы хотите сделать это рекурсивно, и обратите внимание, что когда вы делаете list[1:], вы выполняете сортировку списка, которая каждый раз создает новый список ,

Таким образом, если делать это без рекурсии допускается, используйте встроенный list.index метод:

>>> def search(my_list, number): 
...  try: return my_list.index(number) 
...  except ValueError: return -1 
... 
>>> search([1,2,3,4,5],5) 
4 
>>> search([1,2,3,4,5],6) 
-1 
+0

Или ... вы можете просто обернуть оператор if в try, кроме блока. –

+0

@jakekimds Это была моя догадка, но просто положить, если внутри try, кроме как не сработает, почему бы вам не попробовать это сделать :) –

+0

Oh. Понимаю. Рекурсивность мешает. –

2

Вы можете также использовать index встроенный метод:

>>> def search(my_list, val): 
...  try: 
...   return my_list.index(val) 
...  except valueError: 
...   return "not found" 
... 
>>> search([1,2,3,4,5],3) 
2 
Смежные вопросы