全局变量扰乱了我的递归函数

col*_*ult 3 python recursion global-variables

我刚遇到一个棘手的问题.以下代码应该将单词拆分成长度的块numOfChar.该函数调用自身,这使得无法res在函数中包含结果列表().但是如果我将其作为全局变量保留在外部,则每次后续调用具有不同输入值的函数都会导致错误的结果,因为res不会被清除.

谁能帮我吗?

这是代码(如果您感兴趣,这是来自PySchools.com的问题7-23):

res = []

def splitWord(word, numOfChar):        
    if len(word) > 0:
        res.append(word[:numOfChar])
        splitWord(word[numOfChar:], numOfChar)    
    return res

print splitWord('google', 2)
print splitWord('google', 3)
print splitWord('apple', 1)
print splitWord('apple', 4)
Run Code Online (Sandbox Code Playgroud)

Hel*_*lgi 5

纯递归函数不应该修改全局状态,这算作副作用.

请尝试以下方法,而不是追加和递归;

def splitWord(word, numOfChar): 
    if len(word) > 0:
        return [word[:numOfChar]] + splitWord(word[numOfChar:], numOfChar)
    else:
        return []
Run Code Online (Sandbox Code Playgroud)

在这里,你将这个单词一次一块地切成碎片,在每次通话的同时将其切断,然后在上升时将这些碎片重建成一个列表.

这是一种称为尾递归的常见模式.

PS As @ e-satisf指出,递归不是在Python中执行此操作的有效方法.另请参阅@ e-satisf的答案,以获得更精细的尾递归示例,以及使用生成器解决问题的更多Pythonic方法.

  • @coltonpagefault:请注意,虽然这是一种很好的方式,可以递归地执行,并且在LISP和Erlang等许多语言中都很有效,但它不是在Python中.因此,您可以使用此示例来学习递归,但您不希望在生产代码中使用它.在真正的Python生活中,你可能会使用一个生成器.我会+1,因为这是问题的正确答案. (2认同)