2014-09-03 52 views
0

我採取這樣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 

任何幫助嗎?

感謝

回答

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消耗你的乾草堆,所以這是一次性搜索。

2

你必須要小心。

首先,當值存在時,您的函數按預期工作。只是做了list1 = [1,2,3,4,5],並調用search(list1,3,0),並得到2作爲答案。

您的實現的一個問題是它彈出列表的值。所以如果你嘗試重複使用這個列表,它將會不完整。搜索後,list1是[3,4,5]。

二。當值不在列表中時,您的實現是錯誤的。基本上你應該在n == list [0]之前執行list1 == []檢查(或len(list1)== 0)。

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功能的打印

def main(): 
    print searchCall(4);