2016-10-02 44 views
-1

TL/DR您如何评估var += func(var, n-1)表单的语句?递归形式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 

我可以跟踪几个不同的交织模式在此输出,(即原来的总和10是所谓的第一,第二和第四个实例;输出结果是两个递归,两个递归和三个递归组的输出; sum/2的输出馈送第三,第五和第七个实例的输入),但是我似乎无法在不知道如何评估的情况下解开它sum *= foo(sum, n-1)或原始sum += foo(sum, n-1)

+2

你需要在你的问题更具体 - 什么是“评估”该行的问题?该函数首先被调用,其结果被加上本地值'sum' – UnholySheep

+5

'+ ='和递归没有什么特别之处。您在右侧有一个表达式,该表达式将被评估并添加到左侧的对象中。递归调用在那里没有什么不同。对于不可变类型,'x + = y'与'x = x + y'是一样的。 –

+0

道歉,如果我根本不知道正确提问的问题。我知道所有这一切。关于评估,在'foo(sum,n-1)'中有两个参数。那是怎么加到'sum'上的?什么被添加到'sum'?我从输出中收集到,它只是加在sum上的'sum'参数,这导致了第二个问题:语句sum + = foo(sum,n-1)'调用另一个' foo(sum,n)',如果是这样,为什么函数在完全耗尽'n == 0'处的'n'并调用'return'之前传递给'sum/2'? – whitehorse

回答

0

在Python中,x += y是相同x = x + y即添加到yx值并保存到x

在你的情况,sum += foo(sum, n-1)foo(sum, n-1)sum返回附加价值,并将其保存为sum

它同样也适用于*=-=等。例如:x *= y指具有x 乘法y和将其保存为x。希望回答你的问题。

阅读:Augmented Assignment Statements了解更多信息。

+4

* x + = y与x = x + y *相同:仅适用于不可变类型。对于可变类型,该选项存在用于就地更改对象。因此,对于列表,“+ =”与“list.extend()”相同,后跟名称的重新绑定。 –

+0

感谢您的回复。我有这样的问题:具有多个参数的函数返回的值的性质是什么,它允许将其添加到单个变量中?只有当左侧的变量也是右侧的参数之一时,这种形式才起作用吗? 'mus + = foo(sum,n-1)'的输出是什么?还有一个后续问题:在上面的函数中,语句'sum + = foo(sum,n-1)'调用另一个'foo(sum,n)'的实例,如果是,为什么函数在'n == 0'完全耗尽'n'之前传递给'sum/2'并调用return? – whitehorse

0

虽然我还没有确切地知道为什么给定函数产生它的输出,我终于想出了这个主题的主要问题,即如何评估var += func(var, n-1)形式的语句。

虽然形式为x += y的陈述足够简单易懂,但所讨论语句右侧的函数具有多个参数。我无法理解的是func(var, n-1)的哪个值被使用以及如何确定。所以我尝试了一下。我在函数中添加了新的第一条语句mus = 3,并用mus += foo(sum, n-1)替换sum += foo(sum, n-1)并打印出结果。我颠倒了函数中的参数位置并检查了结果。我添加了第三个参数,并检查了该功能。每次在sum += foo(sum, n-1)的每个变体中调用sum的值。

然后我从return sum中删除sum并运行它,它产生了一个TypeError然后它被点击。所以我将它更改为return n-1,然后这成为sum += foo(sum, n-1)中所称的值。我将它改为我添加的新的第三个变量,return x,然后这就是所谓的值。

因此,为了评估var += func(var, n-1)形式的语句,您必须检查函数运行时基本情况下返回的参数。更正将不胜感激,如果我错了〜