在我第一次探索递归算法时,遇到了一个我无法弄清的怪异现象。我的功能旨在递归地反转字符串。
def revS(s, new):
n = new
try:
ch = s[-1]
n += ch
revS(s[:-1], n)
except IndexError:
return n
print(revS("test", ""))
但是,它仅打印None
。刚开始,我认为这可能与递归有关,好像我在构建n
之前就将其返回一样。也许我是。但是即使如此,n
在开始任何递归之前仍被分配了一个空字符串。因此,至少我希望它返回一个空字符串,而不是None
此外,如果我将异常处理更改为print(n)
,并且对revS("test", "")
的调用将按预期进行。
我想念什么?
答案 0 :(得分:1)
实际上与递归有关。
您的函数仅在出现异常时才返回,但在所有其他情况下都没有return语句,因此与返回None
相同。
在发生异常时返回n
时,该值将转到调用函数,依此类推,直到第一个函数调用(您对revS
的拳头调用)为止,并且该值将返回None,也不例外。
如果您以此更改第六行,它将起作用:
revS(s[:-1], n)
到
return revS(s[:-1], n)