golang 嵌套匿名函数实现递归 2020-07-16 (未允禁转)
2016 年 4 月 23 日
这两天golang刷题碰到个需求,需要在递归调用中不断修改一个共享变量。但是go的变量只能在函数体内赋值的,我如果在递归函数体内给它赋值的话,那递归过程中就会疯狂赋值,这不对的。。。
于是,我搞了另外一个函数 f ,在 f 里面对共享变量赋值,然后 f 内调用递归函数,并把这个共享变量的指针传给递归函数,比较丑陋地实现了。。。递归函数还得带个共享变量的指针
func f() { var share = 0 recursion(20, &share) fmt.Print(share) } func recursion(n int, p *int) int { (*p) ++ if n <= 1 { return n } return recursion(n-1) + recursion(n-2) }
下面看下比较优美的实现
go递归函数修改共享变量
把 递归函数recursion()作为匿名函数 ,嵌套到一个外部函数outer()中。共享变量作为outer的local变量,同时作为recursion()的enclosure变量,从而实现在每一次递归时都可以修改到
func outer() { var share = 0 recursion := func(n int) int { share ++ // 递归出口 if n <= 1 { return n } return recursion(n-1) + recursion(n-2) } recursion(20) fmt.Print(share) } // 报错 // # command-line-arguments // .\main.go:164:10: undefined: recursion。原因是return recursion(n-1) + recursion(n-2)时,recursion未定义,那么我们先声明它一下就没问题了
更正:
func outer() { var share = 0 var recursion func(n int) int recursion = func(n int) int { share++ // 递归出口 if n <= 1 { return n } return recursion(n-1) + recursion(n-2) } recursion(20) fmt.Print(share) }
微信扫码关注站长公众号,和站长交流学习