Python递归列表搜索功能

Mat*_*son 1 python recursion search list

我必须编写一个递归函数来搜索特定值的列表。该函数应该查找该数字是否在列表中,如果是,它将返回该值的列表索引。

例如:

search([1,2,3,4,5],3)
Run Code Online (Sandbox Code Playgroud)

应该返回:

2
Run Code Online (Sandbox Code Playgroud)

因为 3 出现在列表索引 2 中。

现在我有:

def search(myList, number):
    if myList[0] == number:
        return myList[0]
    return search(myList[1:], number)
Run Code Online (Sandbox Code Playgroud)

并且它一直为我之前的同一个函数调用返回 3。任何帮助将不胜感激。

mu *_*u 無 5

您当前的代码中有 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
Run Code Online (Sandbox Code Playgroud)

现在如果我们有列表中的数字就可以工作,但如果没有,我们将得到一个索引错误。

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

因此,我们应该将函数包装在 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
Run Code Online (Sandbox Code Playgroud)

现在,它将起作用

>>> search([1,2,3,4,5],6)
-1
>>> search([1,2,3,4,5],5)
4
Run Code Online (Sandbox Code Playgroud)

但是,仅当您想递归执行此操作时才应使用上述内容,并注意,当您执行此操作时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
Run Code Online (Sandbox Code Playgroud)