Python中双递归的结果

时间:2016-08-02 14:41:05

标签: python recursion

我对这些代码行有疑问。我试图弄清楚打印声明会显示什么:

def f(s):
    if len(s) <= 1:
        return s
    return f(f(s[1:])) + s[0]
print f("abcd")

我希望它能打印出来:dcba但是却显示:dbca

如果有人能向我解释为什么会发生这种情况,我真的很感激。我的目标不是以打印dcba的方式更改为代码,而只是为了理解它的行为方式。提前感谢您提供的每一项帮助。 干杯

3 个答案:

答案 0 :(得分:3)

让我们自下而上。

在单字符字符串上调用f只会返回该字符串。防爆。 f(&#34; a&#34;)返回&#34; a&#34;。

在双字符字符串上调用f会返回该字符串。防爆。 f(&#34; ab&#34;)== f(f(&#34; b&#34;))+&#34; a&#34; == f(&#34; b&#34;)+&#34; a&#34; ==&#34; b&#34; +&#34; a&#34; ==&#34; ba&#34;。

在三个字符的字符串上调用f将返回该字符串,最左边的字符移动到右端。防爆。 f(&#34; abc&#34;)== f(f(&#34; bc&#34;))+&#34; a&#34; == f(&#34; cb&#34;)+&#34; a&#34; ==&#34; bc&#34; +&#34; a&#34; ==&#34; bca&#34;。

在一个四字符串上调用f会返回一些与你得到的结果相符的复杂情况:f(&#34; abcd&#34;)== f(f(&#34; bcd&#34; ))+&#34; a&#34; == f(&#34; cdb&#34;)+&#34; a&#34; ==&#34; dbc&#34; +&#34; a&#34; ==&#34; dbca&#34;。

答案 1 :(得分:2)

如果你想跟随电话,请添加一些打印声明:

properties

答案 2 :(得分:1)

我没有通过调试器运行您的代码,因此我无法完全看到堆栈跟踪,但这是由于您递归调用f()两次。这似乎过度操纵了导致意外转换的字符串。如果你想以递归方式反转字符串,下面的代码非常流行:

def f(s):
    if len(s) == 0:
        return s
    return f(s[1:]) + s[0]

示例结果:

print f("abcd")
>>> dcba

话虽如此(我认为这是一个学习练习?),反向字符串的更强大的 pythonic 方法是使用extended slice syntax { {1}}。

[being:end:step]