我用Python写了一个线性搜索的代码(递归),有人能告诉我为什么它不工作吗?错误-超过最大递归深度

roejwanj  于 2023-01-27  发布在  Python
关注(0)|答案(3)|浏览(158)
lister=[4,5,1,2,3,6]

i=0
def Search(arr):
    if arr[i]==3:
        return i
    else:
        if i>=0 and i<=(len(arr)-2):          
            i+1
            return Search(arr)
        else:
            return -1

print(Search(lister))

在python中使用递归进行线性搜索。
我不知道为什么它不工作。

qvtsj1bj

qvtsj1bj1#

有两个主要问题。
第一个是你没有在任何地方增加ii+1不修改i,只是返回你没有放在任何地方的i+1的值。要增加i,你应该使用i += 1
第二个原因是在Search函数中没有使用外部定义的i变量。
要解决这个问题,您可以在方法的开头将其声明为全局变量,或者将其作为参数传递给函数。
全局方法(不太可取):

lister=[4,5,1,2,3,6]

i=0
def Search(arr):
    global i
    if arr[i]==3:
        return i
    else:
        if i>=0 and i<=(len(arr)-2):          
            i+=1
            return Search(arr)
        else:
            return -1

print(Search(lister))

和参数法(这将是更可取的):

lister=[4,5,1,2,3,6]

def Search(arr, i=0):
    if arr[i]==3:
        return i
    else:
        if i>=0 and i<=(len(arr)-2):          
            i+=1
            return Search(arr, i)
        else:
            return -1

print(Search(lister))
wd2eg0qa

wd2eg0qa2#

您没有递增i变量。您有i+1,但没有将其赋值给i。您应该有i=i+1i+=1作为缩写。由于i不变,因此此递归调用函数无限循环。

2w2cym1i

2w2cym1i3#

与其显式测试索引是否在范围内,为什么不使用异常处理呢?您还可以通过这种方式管理任何潜在的递归"溢出"。例如:

def rfind(_list, val, idx=0):
    try:
        if _list[idx] == val:
            return idx
        return rfind(_list, val, idx+1)
    except (IndexError, RecursionError):
        return -1

print(rfind([1, 2, 3], 2))
print(rfind([1, 2, 3], 4)) # will return None due to IndexError
print(rfind([], 4)) # will return None due to IndexError
print(rfind([0]*2000, 1)) # will return None due to RecursionError
    • 输出:**
1
-1
-1
-1

相关问题