函数闭包递归的问题。

来源:7-1 函数式编程

慕圣3495826

2018-03-15

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。 


写回答

4回答

ccmouse

2018-03-16

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

1
4
ccmouse
回复
FDmitnick
的确是这样的,这个sum被存起来了。这个adder返回的函数除了一段代码,还有这个sum。跟递归的确没有关系。
2019-09-08
共4条回复

aZhuang

2021-03-31

这不是递归

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

0
0

qq_白澤_0

2020-08-13

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

0
0

ccmouse

2018-03-16

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

0
0

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程