返回函数如何在递归中起作用?

时间:2013-03-15 01:24:01

标签: python

我不知道return语句在任何递归函数中的工作方式(在python中)。当你在递归函数中返回“东西”时,有人可以给我一些基本的例子来说明发生了什么吗?

3 个答案:

答案 0 :(得分:1)

递归是一种优雅的编程风格,其中函数以更简单的形式调用自身,直到实现最简单的形式。

这个最简单的形式称为“基本情况”(在下面的示例中,基本情况为if n == 1: return 1,因为对于阶乘,1是您需要达到的最简单的情况)这是一个测试,看看是否或不是输入处于最简单的状态。

递归函数的另一部分是'递归情况',它进一步简化了函数(在下面的例子中,n * factorial(n-1)是递归情况,因为它使用n-1简化了函数)。

一个简单的递归因子函数:

def factorial(n): # only works for positive numbers
    if n == 1: return 1 # base case
    return n * factorial(n-1) # recursive case; only executed if the above is not
                              # executed because 'return' stops a function

因子是所有数字的乘积,包括n

让我们分开: factorial(4)

  1. n是1吗?不,所以return n * factorial(n-1)
  2. 4 * factorial(4-1) = 4 * factorial(3)
  3. n是1吗?不,所以return n * factorial(n-1)
  4. 3 * factorial(3-1) = 3 * factorial(2)
  5. n是1吗?不,所以return n * factorial(n-1)
  6. 2 * factorial(2-1) = 2 * factorial(1)
  7. n是1吗?是的,所以return 1
  8. 现在让我们跟踪调用:

    步骤1,3,5只是检查,所以他们并没有真正返回任何内容:

    • 第2步:factorial(4) = 4 * factorial(3)
    • 第4步:factorial(3) = 3 * factorial(2)
    • 第6步:factorial(2) = 2 * factorial(1)
    • 第7步:factorial(1) = 1

    因此,跟踪return语句: 1 * 2 * 3 * 4 = 24,这是4的阶乘。

答案 1 :(得分:1)

当函数进行递归调用时,控件将传递给被调用的函数。当函数返回时,控件将该函数的 out 传递给调用它的函数。这是一个交互式调试器如何描述正在发生的事情:步骤 in 到一个函数,步骤 over 每个语句,步骤 out 该函数。< / p>

函数调用的常用簿记是称为堆栈的结构。我们应该想象一堆靠在弹簧上的盘子。函数的每次调用(调用)都是“推”到堆栈“顶部”的另一个板。每次从函数返回“弹出”该调用都会从堆栈中弹出。

答案 2 :(得分:1)

这是一个使用缩进来表示递归调用的简单示例(通过测量堆栈的深度)

>>> import inspect
>>> def factorial(n):
...     print('{:{}}factorial({})'.format('', len(inspect.stack()), n))
...     retval = 1 if n == 1 else n * factorial(n-1)
...     print('{:{}}return {}'.format('', len(inspect.stack()), retval))
...     return retval
... 
>>> factorial(5)
  factorial(5)
   factorial(4)
    factorial(3)
     factorial(2)
      factorial(1)
      return 1
     return 2
    return 6
   return 24
  return 120
120