内容简介:这两天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)
}
微信扫码关注站长公众号,和站长交流学习
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- [OC] 使用 block 实现函数嵌套
- Node.JS中回调嵌套和async/await执行空函数性能效率对比测试
- node.js将回调函数嵌套,用promise改造成async/await顺序执行:异常处理和返回多个参数
- Python 循环嵌套
- MyBatis嵌套查询解析
- MyBatis嵌套查询解析
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
企业应用架构模式
Martin Fowler / 王怀民、周斌 / 机械工业出版社 / 2010-4 / 59.00元
《企业应用架构模式》作者是当今面向对象软件开发的权威,他在一组专家级合作者的帮助下,将40多种经常出现的解决方案转化成模式,最终写成这本能够应用于任何一种企业应用平台的、关于解决方案的、不可或缺的手册。《企业应用架构模式》获得了2003年度美国软件开发杂志图书类的生产效率奖和读者选择奖。《企业应用架构模式》分为两大部分。第一部分是关于如何开发企业应用的简单介绍。第二部分是《企业应用架构模式》的主体......一起来看看 《企业应用架构模式》 这本书的介绍吧!
CSS 压缩/解压工具
在线压缩/解压 CSS 代码
HEX HSV 转换工具
HEX HSV 互换工具