大佬们好,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 次,怎么用递归函数实现呢?小弟是新手,搞不懂,特意上来请教,感谢大家
1
Kumo31 2023-08-28 02:18:49 +08:00 via iPhone
func add(n int) {
if n < 0 { return } if n == 0 { ... return } for i:=0; i<len(s); i++{ add(n-1) } } |
3
itakeman OP @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) } |
4
itakeman OP @Kumo31 相这种多重 for 循环嵌套,拼接字符串,不知道如何递归函数实现?写了好久都不知道如何实现,可能自己是新手吧,求大佬指点一下
|
5
rbe 2023-08-28 06:53:43 +08:00
@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) } |
6
itakeman OP @rbe 我平时确实这样写的。。。人比较笨,直到遇到好像要一直嵌套的或者嵌套不同数目的例子人就傻了。即便按照一楼大佬的方法,我也想不出怎么写。大佬的方案确实有用,换做我想破脑袋都想不出来。编程是我我的小小爱好,感谢大佬的指导,使我感觉编程更有乐趣了
|
7
itakeman OP @rbe 想了好久,还是不清楚大佬 generateStrings(n-1, prefix+string(s[i]))... 这个怎么想出来的,太精妙了。想请问大佬,需要补充哪些知识才能有这种思维?
|
8
cmdOptionKana 2023-08-28 08:12:36 +08:00
@itakeman 递归本来就是个难点,其实没有必要执着使用递归。
另外你可以学一下 Erlang (或其他纯函数式编程语言),对理解递归有很大帮助。我也是对递归特别头疼,直到有一次看 Erlang 的入门教程,才感觉有点开窍。 |
9
itakeman OP @cmdOptionKana 其实该用递归还是不可避免的,一直对这个好像懂了又好像没懂。直到遇到昨天的问题才想着想把递归吃透。感谢大佬指点,看样子要花点时间看看其他函数式编程语言了
|
10
cmdOptionKana 2023-08-28 08:36:25 +08:00
@cmdOptionKana 当时学 Erlang ,印象最深刻的就是,它想循环就只能用递归,没有其他实现循环的方法了,学不会递归根本没法用,因此它的教程也会特别深入浅出讲解递归。
|
11
itakeman OP @cmdOptionKana 说的我都想马上学起来了,哈哈
|
12
des 2023-08-28 09:06:30 +08:00 via iPhone
呃呃,想要深入了解的话建议看点数据结构与算法吧
|
16
Masoud2023 2023-08-28 09:35:44 +08:00
除非算法需要,不然能别递归就别递归了吧,,调用栈有最大层数限制的吧
|
17
Nazz 2023-08-28 09:56:33 +08:00
m = len(s), 你的问题可以用 n 位 m 进制数来进行转换, 就变成了 1 层循环
|
18
Projection 2023-08-28 10:25:29 +08:00
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/ |
19
MoYi123 2023-08-28 12:29:02 +08:00
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 的流程, 然后把每一位的数分别取出来, 就实现了上面的多重循环的功能. |
20
dawn4u 2023-08-28 14:09:30 +08:00
推荐这本书 The Little Schemer
|
23
itakeman OP @Projection 看了一下,网站真的是好网站,感谢指导
|
24
itakeman OP @Projection 看了一下,网站真的是好网站,感谢指导
|