2015-09-04 100 views
3
found = 0 
def new(string): 
    global found 

    if found > len(string): 
     return 0 

    fish = string.find('x',found,len(string)) 
    found = fish + 1 

    return new(string) + 1 


text = 'onxonxoinxoinoxn' 
final_text = text + 'x' 
print new(final_text) 

所以我是新的遞歸,我知道有一個更簡單的方法來做到這一點,但有人可以解釋如何解決this.this基本上是一個遞歸函數來找到總次數在變量'text'中可以找到一個字母'x'。遞歸Python腳本

This is my error: 
4 
7 
11 
16 
18 
0 
4 
7 
Traceback (most recent call last): 
11 
16 
    File "/Users/Charana/Documents/Projects/untitled/Main.py", line 18,  
在 新(final_text)

RuntimeError:最大遞歸深度超過

所以它的工作原理,但它仍然loop.how做我讓它停下 三江源提前

+0

您應該測試'fish'不'-1'因爲這意味着沒有'x'任何更多的(退出)。在你的情況下,'found'獲得'fish + 1',這是'0',因此重啓。 –

回答

6
found > len(string) 

這種情況永遠不會是真的,因爲str.find將始終返回結果< len(s)

正確的返回值來檢查的時候沒有結果-1。但是,你需要小心的增加,因爲這將-1改變無效的結果0繼續循環。所以,你應該重新安排你的邏輯有點:

def new(string): 
    global found 

    fish = string.find('x',found,len(string)) 
    if fish < 0: 
     return 0 

    found = fish + 1 
    return new(string) + 1 

注意,使用全局變量這樣的功能,特別是對於遞歸函數,是一個壞主意。您無法完全控制它,相反,您還需要確保在調用該函數時重置其值。相反,您應該保留所有信息,並在必要時將其傳遞給遞歸調用。你可以改變你的功能是這樣的:

def new (string, found = 0): 
    fish = string.find('x', found) 
    if fish < 0: 
     return 0 
    return new(string, fish + 1) + 1 

這將使用默認參數值,以確保found開始以0而對於遞歸調用,它只是通過新found值,所以接下來的功能可以從這裏開始。

最後要說明的是,您應該嘗試爲函數和變量使用描述性名稱。該函數應該計算'x'的出現次數,因此count_x可能會更好。此外,在這方面變量found傳達它包含的x出現你已經發現的數量的意義;相反,這是繼續搜索的起點偏移量;和fish就是壞的,因爲它是未來'x'的只是指數:

def count_x (string, offset = 0): 
    index = string.find('x', offset) 
    if index < 0: 
     return 0 
    return count_x(string, index + 1) + 1 

最後,萬一你不知道,也有一個內置的功能str.count它做同樣的事情:)

+0

非常感謝。但是這可能聽起來很愚蠢,但是爲什麼'if'語句'fish <0'在字符串末尾處得到滿足.do's不'fish <0'適用於字符串中的每個字母。爲什麼當它到達最後一個'x' – Charana

+0

字符串的最後一個字符的索引爲「len(string) - 1」(因爲第一個字符位於索引0處)。和'string.find()'返回字符的索引,或者當它在字符串中找不到字符時返回'-1'。所以我們檢查'-1'(或者'<0')來判斷字符串中是否有匹配。 – poke