var + = func(var,n-1)

时间:2016-10-02 12:38:28

标签: python python-3.x recursion

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)的情况下解开它。

2 个答案:

答案 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)形式的语句,您必须检查在运行函数时查看基本情况中返回的参数。如果我错了,可以非常感谢校正〜