golang 嵌套匿名函数实现递归 2020-07-16 (未允禁转)

栏目: IT技术 · 发布时间: 5年前

内容简介:这两天golang刷题碰到个需求,需要在递归调用中不断修改一个共享变量。但是go的变量只能在函数体内赋值的,我如果在递归函数体内给它赋值的话,那递归过程中就会疯狂赋值,这不对的。。。于是,我搞了另外一个函数 f ,在 f 里面对共享变量赋值,然后 f 内调用递归函数,并把这个共享变量的指针传给递归函数,比较丑陋地实现了。。。递归函数还得带个共享变量的指针下面看下比较优美的实现

这两天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)
}

微信扫码关注站长公众号,和站长交流学习

golang 嵌套匿名函数实现递归 2020-07-16 (未允禁转)

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Android编程权威指南(第2版)

Android编程权威指南(第2版)

Bill Phillips、Chris Stewart、Brian Hardy、Kristin Marsicano / 王明发 / 人民邮电出版社 / 2016-5 / 109.00 元

Big Nerd Ranch是美国一家专业的移动开发技术培训机构。本书主要以其Android训练营教学课程为基础,融合了几位作者多年的心得体会,是一本完全面向实战的Android编程权威指南。全书共34章,详细介绍了8个Android 应用。通过这些精心设计的应用,读者可掌握很多重要的理论知识和开发技巧,获得最前沿的开发经验。 如果你熟悉Java语言,或者了解面向对象编程,那就立刻开始And......一起来看看 《Android编程权威指南(第2版)》 这本书的介绍吧!

html转js在线工具
html转js在线工具

html转js在线工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具