递归函数的序列/堆栈图

时间:2010-12-21 16:10:26

标签: python string recursion sequence-diagram

代码如下:

def printList(L):

   if L:

       print L[0]

       printList(L[1:])

我可以有这样的序列图:

# NON PYTHON PSEUDO CODE

PrintList([1,2,3])

  prints [1,2,3][0] => 1

  runs printList([1,2,3][1:]) => printList([2,3])

  => we're now in printList([2,3])

        prints [2,3][0] => 2

        runs printList([2,3][1:]) => printList([3])

    => we are now in printList([3])

          prints [3][0] => 3

          runs printList([3][1:]) => printList([])

          => we are now in printList([])

                "if L" is false for an empty list, so we return None

    => we are back in printList([3])

          it reaches the end of the function and returns None

  => we are back in printList([2,3])

    it reaches the end of the function and returns None

=> we are back in printList([1,2,3])

  it reaches the end of the function and returns None

所以我的问题是如果我将代码更改为:

def printList(L):

   if L:
       print L[0]
       printList(L[1:])
       print L[0]

如何更改序列图,我想了解在执行此代码期间究竟发生了什么。

1 个答案:

答案 0 :(得分:1)

在递归调用之后调用的print语句将“在备份的路上”被命中。也就是说,您的每个语句:“它到达函数的末尾并返回None”可以更改为“它打印L [0]的当前值,到达函数的末尾,并返回None”,这将分别为3,2和1。

像这样:

PrintList([1,2,3])
prints [1,2,3][0] => 1
runs printList([1,2,3][1:]) => printList([2,3])
=> we're now in printList([2,3])
    prints [2,3][0] => 2
    runs printList([2,3][1:]) => printList([3])
    => we are now in printList([3])
        prints [3][0] => 3
        runs printList([3][1:]) => printList([])
        => we are now in printList([])
            "if L" is false for an empty list, so we return None
        => we are back in printList([3])
        prints [3][0] => 3
        it reaches the end of the function and returns None
    => we are back in printList([2,3])
   prints [2,3][0] => 2
   it reaches the end of the function and returns None
=> we are back in printList([1,2,3])
prints [1,2,3][0] => 1
it reaches the end of the function and returns None