我不知道return语句在任何递归函数中的工作方式(在python中)。当你在递归函数中返回“东西”时,有人可以给我一些基本的例子来说明发生了什么吗?
答案 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)
:
n
是1吗?不,所以return n * factorial(n-1)
4 * factorial(4-1)
= 4 * factorial(3)
n
是1吗?不,所以return n * factorial(n-1)
3 * factorial(3-1)
= 3 * factorial(2)
n
是1吗?不,所以return n * factorial(n-1)
2 * factorial(2-1)
= 2 * factorial(1)
n
是1吗?是的,所以return 1
现在让我们跟踪调用:
步骤1,3,5只是检查,所以他们并没有真正返回任何内容:
factorial(4) = 4 * factorial(3)
factorial(3) = 3 * factorial(2)
factorial(2) = 2 * factorial(1)
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