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 (未允禁转)

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

查看所有标签

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

JavaScript语言精粹

JavaScript语言精粹

Douglas Crockford / 赵泽欣、鄢学鹍 / 电子工业出版社 / 2009-4 / 35.00元

本书通过对JavaScript语言的分析,甄别出好的和坏的特性,从而提取出相对这门语言的整体而言具有更好的可靠性、可读性和可维护性的JavaScript的子集,以便你能用它创建真正可扩展的和高效的代码。 雅虎资深JavaScript架构师Douglas Crockford倾力之作。 向读者介绍如何运用JavaScript创建真正可扩展的和高效的代码。一起来看看 《JavaScript语言精粹》 这本书的介绍吧!

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具