V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
itakeman
V2EX  ›  Go 编程语言

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

  •  
  •   itakeman · 2023-08-28 00:19:23 +08:00 · 2427 次点击
    这是一个创建于 455 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大佬们好,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 次,怎么用递归函数实现呢?小弟是新手,搞不懂,特意上来请教,感谢大家

    24 条回复    2023-08-28 16:10:30 +08:00
    Kumo31
        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)
    }
    }
    itakeman
        2
    itakeman  
    OP
       2023-08-28 06:27:37 +08:00
    @Kumo31 感谢大佬指导,求和没有问题了。但是我原本的递归想法还是不知道如何实现,我贴一下原代码吧
    itakeman
        3
    itakeman  
    OP
       2023-08-28 06:33:47 +08:00
    @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
        4
    itakeman  
    OP
       2023-08-28 06:35:32 +08:00
    @Kumo31 相这种多重 for 循环嵌套,拼接字符串,不知道如何递归函数实现?写了好久都不知道如何实现,可能自己是新手吧,求大佬指点一下
    rbe
        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)
    }
    itakeman
        6
    itakeman  
    OP
       2023-08-28 07:07:27 +08:00
    @rbe 我平时确实这样写的。。。人比较笨,直到遇到好像要一直嵌套的或者嵌套不同数目的例子人就傻了。即便按照一楼大佬的方法,我也想不出怎么写。大佬的方案确实有用,换做我想破脑袋都想不出来。编程是我我的小小爱好,感谢大佬的指导,使我感觉编程更有乐趣了
    itakeman
        7
    itakeman  
    OP
       2023-08-28 07:57:34 +08:00
    @rbe 想了好久,还是不清楚大佬 generateStrings(n-1, prefix+string(s[i]))... 这个怎么想出来的,太精妙了。想请问大佬,需要补充哪些知识才能有这种思维?
    cmdOptionKana
        8
    cmdOptionKana  
       2023-08-28 08:12:36 +08:00
    @itakeman 递归本来就是个难点,其实没有必要执着使用递归。

    另外你可以学一下 Erlang (或其他纯函数式编程语言),对理解递归有很大帮助。我也是对递归特别头疼,直到有一次看 Erlang 的入门教程,才感觉有点开窍。
    itakeman
        9
    itakeman  
    OP
       2023-08-28 08:23:25 +08:00
    @cmdOptionKana 其实该用递归还是不可避免的,一直对这个好像懂了又好像没懂。直到遇到昨天的问题才想着想把递归吃透。感谢大佬指点,看样子要花点时间看看其他函数式编程语言了
    cmdOptionKana
        10
    cmdOptionKana  
       2023-08-28 08:36:25 +08:00
    @cmdOptionKana 当时学 Erlang ,印象最深刻的就是,它想循环就只能用递归,没有其他实现循环的方法了,学不会递归根本没法用,因此它的教程也会特别深入浅出讲解递归。
    itakeman
        11
    itakeman  
    OP
       2023-08-28 09:04:03 +08:00
    @cmdOptionKana 说的我都想马上学起来了,哈哈
    des
        12
    des  
       2023-08-28 09:06:30 +08:00 via iPhone
    呃呃,想要深入了解的话建议看点数据结构与算法吧
    itakeman
        13
    itakeman  
    OP
       2023-08-28 09:08:39 +08:00
    @des 这东西难吗?需要花的时间多少?其实我学编程只是当业余爱好来玩的。我补充知识单纯是想某门语言突破某个难点
    des
        14
    des  
       2023-08-28 09:10:58 +08:00 via iPhone
    @itakeman 比较枯燥,可以先翻翻看有哪些东西,扩宽一下思路也是不错的
    itakeman
        15
    itakeman  
    OP
       2023-08-28 09:16:11 +08:00
    @des 感谢前辈指导
    Masoud2023
        16
    Masoud2023  
       2023-08-28 09:35:44 +08:00
    除非算法需要,不然能别递归就别递归了吧,,调用栈有最大层数限制的吧
    Nazz
        17
    Nazz  
       2023-08-28 09:56:33 +08:00
    m = len(s), 你的问题可以用 n 位 m 进制数来进行转换, 就变成了 1 层循环
    Projection
        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/
    MoYi123
        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 的流程, 然后把每一位的数分别取出来, 就实现了上面的多重循环的功能.
    dawn4u
        20
    dawn4u  
       2023-08-28 14:09:30 +08:00
    推荐这本书 The Little Schemer
    itakeman
        21
    itakeman  
    OP
       2023-08-28 16:06:43 +08:00
    @Nazz 不是很懂
    itakeman
        22
    itakeman  
    OP
       2023-08-28 16:07:19 +08:00
    @MoYi123 不知道如何实现,感觉是越来越复杂了...
    itakeman
        23
    itakeman  
    OP
       2023-08-28 16:10:30 +08:00
    @Projection 看了一下,网站真的是好网站,感谢指导
    itakeman
        24
    itakeman  
    OP
       2023-08-28 16:10:30 +08:00
    @Projection 看了一下,网站真的是好网站,感谢指导
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3616 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 11:10 · PVG 19:10 · LAX 03:10 · JFK 06:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.