我正在Python上实现递归顺序搜索:
def search(list1,n,pos):
if n==list1[0]:
return pos
else:
if list1==[]:
return -1
else:
pos=pos+1
list1.pop(0)
return search(list1,n,pos)
def searchCall(n):
anylist=[1,2,3,4,5,6,7,8,9,10]
pos=0
search(anylist,n,pos)
def main():
i=searchCall(8)
print i
if __name__=="__main__":
main()
所以我要做的是尝试在列表中找到元素n,并在每次递归调用中弹出列表的第一个元素,再次使用剩余列表调用搜索。问题在于,当我把它放在:
if n==list1[0]:
print pos
它会打印找到元素的位置,但是当我改为:
时return pos
它打印无
当找不到该元素时,它应该返回-1,而是显示以下错误消息:
if n==list1[0]:
IndexError: list index out of range
任何帮助?
感谢
答案 0 :(得分:4)
当找不到元素时,您已弹出列表中的每个项目,因此其长度为0.这意味着您应该在开头检查该条件:
def search(list1,n,pos):
if list1==[]:
return -1
if n==list1[0]:
return pos
else:
pos=pos+1
list1.pop(0)
return search(list1,n,pos)
def searchCall(n):
anylist=[1,2,3,4,5,6,7,8,9,10]
pos=0
print search(anylist,n,pos)
编辑:正如Innox所说,只要你调用searchCall
,你就会很好,因为它每次都会实例化一个新列表,但search
消耗你的干草堆,所以它是一次性搜索。
答案 1 :(得分:2)
你必须小心。
首先,当值存在时,您的函数按预期工作。刚做了list1 = [1,2,3,4,5]并调用了搜索(list1,3,0)并得到了2作为答案。
您的实施的一个问题是它会弹出列表的值。因此,如果您尝试重用该列表,它将是不完整的。搜索调用后,list1为[3,4,5]。
二。当值不在列表中时,您的实现是错误的。基本上你应该在n == list [0]之前执行list1 == []检查(或len(list1)== 0)。
答案 2 :(得分:2)
这是因为你没有返回search(anylist,n,pos)
的值
这就是为什么它只打印无。因为函数本身没有返回任何内容,因此当您想要打印结果时,它是None。
当您返回search
的结果时,您可以打印searchCall
函数的结果。
您必须将功能更改为:
def searchCall(n):
anylist=[1,2,3,4,5,6,7,8,9,10]
pos=0
return search(anylist,n,pos)
你得到了例外,因为你首先要求列表的第一项在列表为空的情况下不存在。
所以我建议对search
函数
def search(list1,n,pos):
if list1==[]:
return -1
elif n==list1[0]:
return pos;
else:
pos=pos+1
list1.pop(0)
b= search(list1,n,pos)
return b;
首先验证列表是否为空,然后继续。
修改强>
只是为了让它完整......
使用此main
函数,它会打印 -1
def main():
print searchCall(15);
此main
功能打印 3
def main():
print searchCall(4);