递归顺序搜索不返回值

时间:2014-09-03 12:47:31

标签: python recursion

我正在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

任何帮助?

感谢

3 个答案:

答案 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);