Python中双重递归的结果

Python中双重递归的结果,python,recursion,Python,Recursion,我有一个关于这些代码行的问题。我在想打印报表会显示什么: def f(s): if len(s) <= 1: return s return f(f(s[1:])) + s[0] print f("abcd") def(s): 如果len(s)我没有通过调试器运行您的代码,因此无法准确查看堆栈跟踪,但这是由于您递归调用了两次f()。这似乎过度操纵了字符串,导致了意外的转换。如果要递归反转字符串,下面的代码相当流行: def f(s): if len

我有一个关于这些代码行的问题。我在想打印报表会显示什么:

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

如果len(s)我没有通过调试器运行您的代码,因此无法准确查看堆栈跟踪,但这是由于您递归调用了两次
f()
。这似乎过度操纵了字符串,导致了意外的转换。如果要递归反转字符串,下面的代码相当流行:

def f(s):
    if len(s) == 0:
        return s
    return f(s[1:]) + s[0]
样本结果:

print f("abcd")
>>> dcba
话虽如此(我想这是一个学习练习?),一个更具pythonic风格的方法是使用
[being:end:step]

print 'abcd'[::-1]
>>> dcba

让我们从头开始

对一个字符串调用
f
,只会返回该字符串。Ex.f(“a”)返回“a”

对两个字符的字符串调用
f
,将返回反向的字符串。例如,f(“ab”)==f(f(“b”)+“a”==f(“b”)+“a”==f(“b”)+“b”+“a”==ba”

对一个三个字符的字符串调用
f
,返回该字符串,并将最左端的字符移到右端。例如,f(“abc”)==f(f(“bc”)+“a”==f(“cb”)+“a”==“bc”+“a”==“bca”


对一个四个字符的字符串调用
f
会返回一些与您得到的结果相对应的复杂结果:f(“abcd”)==f(f(“bcd”)+“a”==f(“cdb”)+“a”==“dbc”+“a”==“dbca”。

如果您想跟随调用,请添加一些打印语句:

>>> def f(s):
...     print
...     print "recieved", s
...     if len(s) <= 1:
...         print "returning", s
...         return s
...     print "returning f(f(%s)) + %s" % (s[1:], s[0])
...     return f(f(s[1:])) + s[0]
...
>>> print f("abcd")

recieved abcd
returning f(f(bcd)) + a

recieved bcd
returning f(f(cd)) + b

recieved cd
returning f(f(d)) + c

recieved d
returning d

recieved d
returning d

recieved dc
returning f(f(c)) + d

recieved c
returning c

recieved c
returning c

recieved cdb
returning f(f(db)) + c

recieved db
returning f(f(b)) + d

recieved b
returning b

recieved b
returning b

recieved bd
returning f(f(d)) + b

recieved d
returning d

recieved d
returning d
dbca
>>定义f(s):
...     打印
...     打印“已接收”,s
...     如果镜头>>打印f(“abcd”)
收到abcd
返回f(f(bcd))+a
收到bcd
返回f(f(cd))+b
收到的cd
返回f(f(d))+c
收到
返回d
收到
返回d
收到信用证
返回f(f(c))+d
收到c
返回c
收到c
返回c
收到国开行
返回f(f(db))+c
接收分贝
返回f(f(b))+d
收到b
返回b
收到b
返回b
收到bd
返回f(f(d))+b
收到
返回d
收到
返回d
dbca

看起来像是一个毫无意义的转换。您从何处获得此代码?您的期望与
返回f(s[1:])+s[0]
不匹配
返回f(f(s[1:])+s[0]
。写出每个函数调用及其结果
f(f(s[1:])
首先计算
f(s[1:])
。结果很奇怪,因为对
f
的双重调用在再次调用
f
之前会对列表进行某种洗牌。我知道这是毫无意义的。我目前正在学习如何编写代码,并使用Python作为编写代码的工具。我把这段代码当作一个“技巧”问题,我仍然想知道它为什么会这样做。正如我所说的,我的目标不是修复代码,而是准确理解其当前行为!我并不是想用这个递归函数来解决一个具体的问题,而是想用这个函数来更好地理解归纳/递归,我(显然,见上文)并没有这样做。这是非常有帮助的。谢谢你的回答!再次被最小编辑大小限制阻止。。。倒数第二段的倒数第二个词应该是
“bc”+“a”
,而不是
f(“bc”)+“a”
。所以它应该是f(“cb”)+“a”==“bc”+“a”,对吗?