采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
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。
第一次调用a(2),的确返回2。但第二次调用,a作为闭包,它里面的sum已经变了。因此第二次调用a(2),结果为4。当然,必须使用同一个a。如果你又用a=adder(),那又从0开始
哈哈 有点想不明白, 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 } }
对,不一定是1到n的顺序,只是正好我的例子里是1到n。 用别的方法当然能算出1到n的和,这里只是说用闭包也能算。 同学没接触过的话,可以先把这个概念打个问号。使用闭包是很自然的过程,我在后面的并发编程以及实战项目中还会多次用到闭包,到时候可以联系起来。
刚看了这个课,还不是很了解,但是感觉这个闭包的概念和递归不是一个逻辑,倒是有点像找了一个地方把sum悄悄存了起来,下次拿出来用,存的这个地方就是这个藏在函数里的函数(闭包), 有点这种静态变量的感觉
这不是递归
你可以把a理解成一个对象,这个对象有一个属性sum, sum的初值是0, 当调用a(1)时 sum是sum+ 1,当调用a(2)时 sum是0 + sum + 2,
可以理解为此处闭包的目的是为了每次将sum存起来,也就是将函数adder()赋值给a作为一个变量的目的。相当于这个状态是保存在a里的。所以每次调用a(i)的话实际上a的sum是上次结束更改后的值。而adder()函数的目的是计算上的处理,实际的值由a决定。
我的课上是先a(1),然后sum变1,然后再a(2),因此返回3
登录后可查看更多问答,登录/注册
语法+分布式爬虫实战 为转型工程师量身打造
3.7k 14
688 1
2.0k 1
1.1k 12