2012-11-13 59 views
1

我寫一個程序,找到list/srting中的特定元素的所有索引號,我必須使用遞歸,而我的func只能得到2個參數。找到所有索引與遞歸

我的問題是我的程序只找到第一個索引並停下來,我該如何處理它?

我的代碼:

def find_all(L, v): 
    return 0 if L[0] == v else 1 + find_all(L[1:], v) 

輸入: 1. find_all([1,2,3,4,2,4,5,2,1], 2) 2. find_all("hello wonderful world", "w")

輸出: 1. [1,4,7] 2. [6,16]

+0

我覺得你試圖寫一行代碼讓自己變得更加困難。嘗試改爲將任何遞歸問題分解爲: 'def find_all(L,v): if condition: return base_cases; else: recursive_calls;' – Austin

+0

你是否想從[re](http://docs.python.org/2/library/re.html)重新實現'findall'? – lucasg

+0

看不到任何理由使用遞歸:'如果我想枚舉(L)如果我[1] == v]' – lenik

回答

4

您可以使用蟒蛇通過倒退行走能力一個列表並抓取最後一個元素。然後將列表與+運算符一起放入。通過向後瀏覽列表,您可以在找到值時找到指示符,而不是在從列表開始移動到結束時丟失它。

def find_all(L, v): 
    if not L: 
      return [] 

    result = [] 
    if L[-1] == v: 
      result = [len(L)-1] 

    return find_all(L[:-1], v) + result 
+0

「如果不是L」是什麼意思? – user1816377

+2

你應該看看這是作業的一部分。它只是意味着「如果L是空的,那麼停止遞歸」 – Genzume

1

你必須以某種方式跟蹤櫃檯。我們的想法是使用find_all(L, v)作爲一個接口來「真正」的遞歸函數:

def find_all(L, v): 
    return _find_all(L, v, 0) 

def _find_all(L, v, position): 
    # Your algorithm here 

考慮到這是家庭作業,我不會爲你做的工作,但你應該能夠保持從這裏去。