2015-09-04 99 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