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)
我从未见过+ =与具有多个参数的函数一起使用,我不知道如何评估它。我在print(sum)
和sum += foo(sum, n-1)
之后添加了sum /= 2
,试着看看发生了什么。运行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)
的情况下解开它。
答案 0 :(得分:0)
在python中,x = x + y
与 y
相同,即将x
添加到x
的值并保存到sum += foo(sum, n-1)
在您的情况下,foo(sum, n-1)
表示添加sum
sum
返回的值,并将其另存为*=
。
同样适用于-=
,x *= y
等。例如:view?.window?.rootViewController?.present(unwrappedPreview, animated: true)
表示将y与x相乘并将其另存为x 。希望能回答你的问题。
阅读:Augmented Assignment Statements了解更多信息。
答案 1 :(得分:0)
虽然我仍然没有确切地知道为什么给定函数产生它的输出,但我终于想出了主题的主要问题,即如何评估var += func(var, n-1)
形式的语句。
虽然x += y
形式的陈述很容易理解,但有关语句右侧的函数有多个参数。我无法理解的是func(var, n-1)
使用了哪个值以及如何确定。所以我试验了。我在函数中添加了新的第一个语句mus = 3
,并将sum += foo(sum, n-1)
替换为mus += foo(sum, n-1)
并打印结果。我颠倒了函数中的参数位置并检查了结果。我在函数中添加了第三个参数并检查了它。每次sum
的每个变体都会调用sum += foo(sum, n-1)
的值。
然后我从sum
删除return sum
并运行它,生成TypeError
,然后点击它。所以我将其更改为return n-1
,然后它成为sum += foo(sum, n-1)
中调用的值。我将其更改为我添加的新第三个变量return x
,然后是名为。
因此,为了评估var += func(var, n-1)
形式的语句,您必须检查在运行函数时查看基本情况中返回的参数。如果我错了,可以非常感谢校正〜