def function(s):
if len(s) == 1:
print s[0],
else:
function(s[1:])
print s[0],
function("1234")
最终打印4 3 2 1
为什么会这样?在功能中,显然第一个条件不符合。在else条件中,s[1:]
被放入s中,但其长度不是1.我只是看不到s[0]
之外的任何内容将被打印到屏幕上。该函数中没有任何东西看起来像是打印s[1:]
,更不用说反过来了。我很困惑。
答案 0 :(得分:9)
>>> def function(s):
... print 's is currently %r' % s
... if len(s) == 1:
... print s[0],
... else:
... function(s[1:])
... print s[0],
...
>>> function("1234")
s is currently '1234'
s is currently '234'
s is currently '34'
s is currently '4'
4 3 2 1
这是一个递归函数,它在打印s [0]之前再次调用它,因此它打印出的项目是相反的。
这是一个可能更有用的示例。
>>> def function(s):
... print 's is currently %r' % s
... if len(s) > 1:
... print 'calling function again with %r as s' % s[1:]
... function(s[1:])
... print s[0],
...
>>> function('1234')
s is currently '1234'
calling function again with '234' as s
s is currently '234'
calling function again with '34' as s
s is currently '34'
calling function again with '4' as s
s is currently '4'
4 3 2 1
答案 1 :(得分:1)
这是一个递归的情况,你用原始输入的较短和较短的子串一遍又一遍地调用函数,直到它是一个长度为1的字符串(原始输入中的最后一个),在这种情况下它开始打印然后“展开”并反向打印其余字符串。
看看这个带注释的代码:
def function(s):
if len(s) == 1:
print 'single:', s[0], # (A) this is where your first output is generated for a single character
else:
print 'calling function again with ',s[1:]
function(s[1:]) # (B) you call function again, i.e., your recursive call
print ' unwind->', s[0], # (C) the "unwinding" step, i.e, finish the rest
# of the function when you return from the recursive call
你得到的输出是:
calling function again with 234
calling function again with 34
calling function again with 4
single: 4 unwind-> 3 unwind-> 2 unwind-> 1
第一次调用函数时,您将进入else
子句并在行(B)中再次调用该函数,但这次使用“234”。现在函数再次启动,但是“234”再次启动到else
并再次调用函数,但现在使用“34”,函数再次运行,现在随身携带到{{1}再一次用“4”调用函数..这次是长度为1,你打印它(A行)。
现在你从这个函数返回(展开过程) - 从你进行递归调用之前的那一点恢复,然后通过打印当前剩余字符的第一个字符反向打印其余的字符串( C)行。
第一次遇到它时很难掌握递归 - 这是完全正常的。在某些时候它会点击并变得清晰。您可能想要阅读一般概念并搜索一些明确的注释示例(大多数CS /编程书籍都会有一些)。
这是一段简短的YouTube视频,通过一个简单的示例解释了Python中的递归,希望它有所帮助:http://www.youtube.com/watch?v=72hal4Cp_2I
答案 2 :(得分:1)
尝试修改这样的功能:
def function(s):
print 'Called with {}'.format(s)
if len(s) == 1:
print s[0]
else:
function(s[1:])
print s[0]
并运行它。您会看到,每次点击function(s[1:])
时,您都会暂停function()
的“运行”,并在暂时暂停的function()
内开始新的function()
运行。对{{1}}的新调用使用字符串的缩短版本。最终,只用一个字符调用它就可以达到第一个条件。
从内部调用函数称为递归。
答案 3 :(得分:0)
让我们看看工作中的递归。
s[1:]
或“234”将函数递归调用
s[1:]
或“34”递归调用函数
s[1:]
或“34”递归调用函数
s[0]
,即4 s[0]
,即3 s[0]
,即2 s[0]
,即1