为什么会出现这种情况?

时间:2012-04-20 03:08:11

标签: python

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:],更不用说反过来了。我很困惑。

4 个答案:

答案 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 =“1234”
  • 调用函数
  • len(s)= 4所以你拿其他
  • 您使用s[1:]或“234”将函数递归调用
    • 现在,你的功能是s =“234”
    • len(s)= 3所以你拿其他
    • s[1:]或“34”递归调用函数
      • 现在,你正在使用s =“34”
      • len(s)= 2所以你拿其他
      • s[1:]或“34”递归调用函数
        • 现在,你正在使用s4“
        • len(s)= 1所以你执行if的第一部分并打印s[0],即4
        • 你回来了
      • 返回上一个电话(s =“34”),您打印s[0],即3
      • 你回来了
    • 返回上一个电话(s =“234”),打印s[0],即2
    • 你回来了
  • 打开前一个电话(s =“1234”),打印s[0],即1
  • 你回来了