请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

函数闭包递归的问题。

func adder() func(int) int {

    sum := 0

    return func(v int) int {

        sum += v

        return sum

    }

}

a := adder()

a 是 func(int) int 的函数。

当调用a(2)  时候,具体递推执行逻辑是怎么样的?  我感觉  a(2) 是 0+2 返回2。 


正在回答 回答被采纳积分+3

4回答

ccmouse 2018-03-16 09:02:05

第一次调用a(2),的确返回2。但第二次调用,a作为闭包,它里面的sum已经变了。因此第二次调用a(2),结果为4。当然,必须使用同一个a。如果你又用a=adder(),那又从0开始

1 回复 有任何疑惑可以回复我~
  • 提问者 慕圣3495826 #1
    哈哈 有点想不明白, a(2) 调用一次就结束了,怎么会调用2次?
    
    我写了几个例子
    a := adder()
    fmt.Println(a(2))    ->   2
    
    a := adder()
    fmt.Println(a(1))    ->   1
    fmt.Println(a(2))    ->   3
    
    a := adder()
    fmt.Println(a(1))    ->   1
    fmt.Println(a(3))    ->   4
    fmt.Println(a(2))    ->   6
    
    a(n) 不一定是对 1到n的求和(必须按顺序)。
    写这个例子的时候,给我的感觉就是 a(n)对 1到n求和。
    闭包的概念有点理解不了,以前也没有用过,主要用在什么地方列?
    另外比起闭包,我觉得递归调用也可以实现吧,并且好理解。下面是类似的实现。
    func adder2(n int) int {
    	if n == 1 {
    		return 1
    	} else {
    		return adder2(n-1) + n
    	}
    }
    回复 有任何疑惑可以回复我~ 2018-03-16 14:19:10
  • ccmouse 回复 提问者 慕圣3495826 #2
    对,不一定是1到n的顺序,只是正好我的例子里是1到n。
    用别的方法当然能算出1到n的和,这里只是说用闭包也能算。
    同学没接触过的话,可以先把这个概念打个问号。使用闭包是很自然的过程,我在后面的并发编程以及实战项目中还会多次用到闭包,到时候可以联系起来。
    回复 有任何疑惑可以回复我~ 2018-03-16 18:37:20
  • FDmitnick 回复 提问者 慕圣3495826 #3
    刚看了这个课,还不是很了解,但是感觉这个闭包的概念和递归不是一个逻辑,倒是有点像找了一个地方把sum悄悄存了起来,下次拿出来用,存的这个地方就是这个藏在函数里的函数(闭包),
    有点这种静态变量的感觉
    回复 有任何疑惑可以回复我~ 2019-09-01 10:22:32
aZhuang 2021-03-31 17:00:33

这不是递归

你可以把a理解成一个对象,这个对象有一个属性sum, sum的初值是0, 当调用a(1)时 sum是sum+ 1,当调用a(2)时 sum是0 + sum + 2,

0 回复 有任何疑惑可以回复我~
qq_白澤_0 2020-08-13 11:56:34

可以理解为此处闭包的目的是为了每次将sum存起来,也就是将函数adder()赋值给a作为一个变量的目的。相当于这个状态是保存在a里的。所以每次调用a(i)的话实际上a的sum是上次结束更改后的值。而adder()函数的目的是计算上的处理,实际的值由a决定。

0 回复 有任何疑惑可以回复我~
ccmouse 2018-03-16 09:03:47

我的课上是先a(1),然后sum变1,然后再a(2),因此返回3

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信