【发布时间】:2016-10-03 11:48:32
【问题描述】:
TL/DR 您如何评估var += func(var, n-1) 形式的语句?
编辑:“评估”是指,该语句右侧调用的值是如何确定的。在下面给出的函数中,var += func(var, n-1) 总是产生sum += sum。但是为什么总是调用sum?为什么不sum += (n-1)?是什么决定了右侧调用哪个值?在一些回复的帮助下,我想我已经弄清楚了(见下文),但对这个主题的更多了解将始终受到赞赏。我才刚学几天编程。
我asked a question regarding a recursive function 收到了一个我很满意的答案,但又提出了几个问题。我一直在查看有关该主题的先前问题,但我仍然缺少一些东西。感觉递归是一个基本概念,必须完全掌握才能成功编程,所以我想一直问问题,直到我弄明白为止。回答者提供了另一个示例函数供我考虑:
def foo(sum, n):
if (n == 0):
return sum
sum += foo(sum, n-1)
sum /= 2
return foo(sum, n-1)
我从未见过 += 与具有多个参数的函数一起使用,我不知道如何评估它。我在sum += foo(sum, n-1) 和sum /= 2 之后添加了print(sum),试图看看发生了什么。运行 foo(10, 3) 导致:
20
10.0
20.0
10.0
20.0
10.0
20.0
10.0
20.0
10.0
20.0
10.0
20.0
10.0
我决定将+= 更改为*=,看看这是否会使发生的事情更清楚。这是那个程序:
def foo(sum, n):
if (n == 0):
return sum
sum *= foo(sum, n-1)
print(sum)
sum /= 2
print(sum)
return foo(sum, n-1)
foo(10, 3)
它产生了以下内容:
100
50.0
500.0
250.0
62500.0
31250.0
312500.0
156250.0
24414062500.0
12207031250.0
1907348632812500.0
953674316406250.0
9.094947017729283e+29
4.5474735088646414e+29
我可以在这个输出中追踪一些不同的交织模式,(即在第 1、第 2 和第 4 个实例中调用原始总和 10;输出分为两个递归、两个递归和三个递归的组;输出sum/2 提供第 3、5 和第 7 个实例的输入),但我似乎无法在不知道如何评估 sum *= foo(sum, n-1) 或原始 sum += foo(sum, n-1) 的情况下解开它。
【问题讨论】:
-
您需要更具体地提出您的问题 - “评估”该行的问题究竟是什么?首先调用该函数并将其结果添加到本地值
sum -
+=和递归没有什么特别之处。您在右侧有一个表达式,它被评估然后添加到左侧的对象中。递归调用在那里没有什么不同。对于不可变类型,x += y与x = x + y完全相同。 -
抱歉,如果我根本不知道如何正确地提出这个问题。这一切我都知道。关于评估,
foo(sum, n-1)中有两个参数。这是如何添加到sum的?sum中添加了什么?我从输出中收集到只有sum参数被添加到sum,这导致了第二个问题:语句sum += foo(sum, n-1)是否调用foo(sum, n)的另一个实例,如果是,为什么函数在n == 0完全耗尽n并调用return之前传递给sum/2?
标签: python python-3.x recursion