2
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:]放入 for s,但它的长度不是 1。我只是看不到外面的任何东西s[0]会如何打印到屏幕上。该函数中没有任何内容看起来像是 print s[1:],更不用说反向了。我很困惑。

4

4 回答 4

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
于 2012-04-20T03:10:59.907 回答
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”,函数再次运行,现在您再次进入else并仅使用“4”调用函数" .. 这次因为它的长度为 1,所以你打印它(A 行)。

现在您从这个函数返回(展开过程) - 并从您进行递归调用之前的位置恢复,并通过打印当前剩余字符的第一个字符(行 C)反向打印字符串的其余部分.

第一次遇到递归可能很难掌握——这很正常。在某些时候,它会点击并变得清晰。您可能想阅读一些关于一般概念的内容并搜索一些清晰的注释示例(大多数 CS/编程书籍都会有一些)。

这是一个简短的 YouTube 视频,通过一个简单的示例解释了 Python 中的递归,希望对您有所帮助:http ://www.youtube.com/watch?v=72hal4Cp_2I

于 2012-04-20T03:10:04.710 回答
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()使用字符串的缩短版本。最终,它只用一个字符调用,并且你达到了第一个条件。

从内部调用函数称为递归

于 2012-04-20T03:13:45.957 回答
0

让我们看看工作中的递归。

  • 首先你用 s="1234" 调用函数
  • len(s) = 4 所以你选择 else
  • 您使用或“234” 递归调用函数s[1:]
    • 现在,您可以使用 s="234"
    • len(s) = 3 所以你选择 else
    • s[1:]您使用或“34” 递归调用函数
      • 现在,您可以使用 s="34"
      • len(s) = 2 所以你选择 else
      • s[1:]您使用或“34” 递归调用函数
        • 现在,您可以使用 s4"
        • len(s) = 1 所以你做 if 和打印的第一部分,s[0]即 4
        • 你回来
      • 返回上一个调用 (s="34") 你 print s[0],即 3
      • 你回来
    • 返回上一个调用 (s="234") 你 print s[0],即 2
    • 你回来
  • CReturning to previous call (s="1234") you print s[0],即 1
  • 你回来
于 2012-04-20T03:18:46.927 回答