我必须编写一个递归函数来搜索列表中的特定值。该函数应该查找该数字是否在列表中,如果是,它将返回该值的列表索引。
例如:
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 :(得分:4)
您当前的代码中有2个错误,您返回的数字是iteself而不是索引,并且您并没有真正传递递增的索引。所以,请改为:
>>> 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
因此,我们应该将函数包装在try-except块
中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
答案 1 :(得分: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