我对这些代码行有疑问。我试图弄清楚打印声明会显示什么:
def f(s):
if len(s) <= 1:
return s
return f(f(s[1:])) + s[0]
print f("abcd")
我希望它能打印出来:dcba
但是却显示:dbca
。
如果有人能向我解释为什么会发生这种情况,我真的很感激。我的目标不是以打印dcba
的方式更改为代码,而只是为了理解它的行为方式。提前感谢您提供的每一项帮助。
干杯
答案 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]