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”,对吗?