go 语言 for 循环多层嵌套怎么用递归函数实现?

258 天前
 itakeman

大佬们好,go 语言 for 循环多层嵌套怎么用递归函数实现,小弟谷歌很久都不知道怎么实现。

func add(n int){
		//n 嵌套次数,比如嵌套两次
    	for i:=0;i<len(s);i++{
    		for k:=0;k<len(s);k++{
        		...
    		}
    	}    
	}

比如上面 n 是 2 就嵌套两次,万一嵌套 n 次呢?请问大佬们,怎么实现参数 n 次,循环就嵌套 n 次,怎么用递归函数实现呢?小弟是新手,搞不懂,特意上来请教,感谢大家

2286 次点击
所在节点    Go 编程语言
24 条回复
Kumo31
258 天前
func add(n int) {
if n < 0 {
return

if n == 0 {
...
return
}
for i:=0; i<len(s); i++{
add(n-1)
}
}
itakeman
258 天前
@Kumo31 感谢大佬指导,求和没有问题了。但是我原本的递归想法还是不知道如何实现,我贴一下原代码吧
itakeman
258 天前
@Kumo31


package main

import "fmt"

var (
s = "abcdefghijklnmopqrstuvwxyz"
)

func main() {
var s1 []string
for i := 0; i < len(s); i++ {
for k := 0; k < len(s); k++ {
for j := 0; j < len(s);j++ {
s1 = append(s1,string(s[i])+string(s[k])+string(s[j])))
}
}
}

fmt.Println(s1)
}
itakeman
258 天前
@Kumo31 相这种多重 for 循环嵌套,拼接字符串,不知道如何递归函数实现?写了好久都不知道如何实现,可能自己是新手吧,求大佬指点一下
rbe
258 天前
@itakeman 首先这个多重 for 循环就很没有必要,只是为了挪一个 index 而已,如果要 10 个长度的字符串难道要写 10 层 for 循环😂

如果你简化了这个 for 循环,参考 1L 的思路就可以写出来了
func generateStrings(n int, prefix string) []string {
if n == 0 {
return []string{prefix}
}
var s1 []string
for i := 0; i < len(s); i++ {
s1 = append(s1, generateStrings(n-1, prefix+string(s[i]))...)
}
return s1
}

func main() {
s1 := generateStrings(3, "")
fmt.Println(s1)
}
itakeman
258 天前
@rbe 我平时确实这样写的。。。人比较笨,直到遇到好像要一直嵌套的或者嵌套不同数目的例子人就傻了。即便按照一楼大佬的方法,我也想不出怎么写。大佬的方案确实有用,换做我想破脑袋都想不出来。编程是我我的小小爱好,感谢大佬的指导,使我感觉编程更有乐趣了
itakeman
258 天前
@rbe 想了好久,还是不清楚大佬 generateStrings(n-1, prefix+string(s[i]))... 这个怎么想出来的,太精妙了。想请问大佬,需要补充哪些知识才能有这种思维?
cmdOptionKana
258 天前
@itakeman 递归本来就是个难点,其实没有必要执着使用递归。

另外你可以学一下 Erlang (或其他纯函数式编程语言),对理解递归有很大帮助。我也是对递归特别头疼,直到有一次看 Erlang 的入门教程,才感觉有点开窍。
itakeman
258 天前
@cmdOptionKana 其实该用递归还是不可避免的,一直对这个好像懂了又好像没懂。直到遇到昨天的问题才想着想把递归吃透。感谢大佬指点,看样子要花点时间看看其他函数式编程语言了
cmdOptionKana
258 天前
@cmdOptionKana 当时学 Erlang ,印象最深刻的就是,它想循环就只能用递归,没有其他实现循环的方法了,学不会递归根本没法用,因此它的教程也会特别深入浅出讲解递归。
itakeman
258 天前
@cmdOptionKana 说的我都想马上学起来了,哈哈
des
258 天前
呃呃,想要深入了解的话建议看点数据结构与算法吧
itakeman
258 天前
@des 这东西难吗?需要花的时间多少?其实我学编程只是当业余爱好来玩的。我补充知识单纯是想某门语言突破某个难点
des
258 天前
@itakeman 比较枯燥,可以先翻翻看有哪些东西,扩宽一下思路也是不错的
itakeman
258 天前
@des 感谢前辈指导
Masoud2023
258 天前
除非算法需要,不然能别递归就别递归了吧,,调用栈有最大层数限制的吧
Nazz
258 天前
m = len(s), 你的问题可以用 n 位 m 进制数来进行转换, 就变成了 1 层循环
Projection
258 天前
LeetCode 中 DFS 、回溯相关的题目基本都是这样的,推荐两个网站学习:

labuladong 的算法小抄 | labuladong 的算法小抄
https://labuladong.github.io/algo/

youngyangyang04/leetcode-master: 《代码随想录》 LeetCode 刷题攻略
https://github.com/youngyangyang04/leetcode-master

全排列问题和 OP 提出的问题比较类似,但是需要回溯,难度也不高,对于理解算法思想比较有帮助,可以先看一下:
https://leetcode.cn/problems/permutations/
MoYi123
257 天前
go 没有尾递归, 没事别写递归
假设 n 是 3, 那么最里面的循环需要的是,
[0,0,0,0]
[0,0,0,1]
[0,0,0,2]
[0,0,1,0]
[0,0,1,1]
....
[2,2,2,1]
[2,2,2,2]

你只需要模拟一个三进制的数,从 0-2222 的流程, 然后把每一位的数分别取出来, 就实现了上面的多重循环的功能.
dawn4u
257 天前
推荐这本书 The Little Schemer

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/968720

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX