为了账号安全,请及时绑定邮箱和手机立即绑定

golang中创建数字组合的递归函数

golang中创建数字组合的递归函数

Go
潇潇雨雨 2021-12-07 18:50:26
我想弄清楚这个递归函数的事情。我有一个有效的非递归演示,但它使用非递归的静态方法。这些函数从“pool_size”中打印出“数字集”的所有组合。如果有人可以,请帮助我使这个函数递归,那会很棒。package mainimport (    "fmt")func combos_of1(pool_size int) {    for i := 1; i < pool_size+1; i++ {        fmt.Println(i)    }    fmt.Println("\n")}func combos_of2(pool_size int) {    for i := 1; i < pool_size+1; i++ {        for j := i + 1; j < pool_size+1; j++ {            fmt.Println(i, j)        }    }    fmt.Println("\n")}func combos_of3(pool_size int) {    for i := 1; i < pool_size+1; i++ {        for j := i + 1; j < pool_size+1; j++ {            for k := j + 1; k < pool_size+1; k++ {                fmt.Println(i, j, k)            }        }    }    fmt.Println("\n")}func main() {    combos_of1(10)    combos_of2(10)    combos_of3(10)}
查看完整描述

1 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

例如,


package main


import "fmt"


func rCombinations(p int, n []int, c []int, ccc [][][]int) [][][]int {

    if len(n) == 0 || p <= 0 {

        return ccc

    }

    if len(ccc) == 0 {

        ccc = make([][][]int, p)

    }

    p--

    for i := range n {

        cc := make([]int, len(c)+1)

        copy(cc, c)

        cc[len(cc)-1] = n[i]

        ccc[len(cc)-1] = append(ccc[len(cc)-1], cc)

        ccc = rCombinations(p, n[i+1:], cc, ccc)

    }

    return ccc

}


func Combinations(p int, n []int) [][][]int {

    return rCombinations(p, n, nil, nil)

}


func main() {

    pools := 3

    numbers := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

    fmt.Println(pools, "pools", "for", "numbers", numbers)

    fmt.Println()

    nc := 0

    c := Combinations(pools, numbers)

    fmt.Println("pools:")

    d := " digit : "

    for i := range c {

        fmt.Println(i+1, d)

        d = " digits: "

        for j := range c[i] {

            nc++

            fmt.Println(c[i][j], " ")

        }

    }

    fmt.Println()

    fmt.Println(nc, "combinations")

}

输出:


3 pools for numbers [1 2 3 4 5 6 7 8 9 10]


pools:

1  digit : 

[1]  

[2]  

[3]  

[4]  

[5]  

[6]  

[7]  

[8]  

[9]  

[10]  

2  digits: 

[1 2]  

[1 3]  

[1 4]  

[1 5]  

[1 6]  

[1 7]  

[1 8]  

[1 9]  

[1 10]  

[2 3]  

[2 4]  

[2 5]  

[2 6]  

[2 7]  

[2 8]  

[2 9]  

[2 10]  

[3 4]  

[3 5]  

[3 6]  

[3 7]  

[3 8]  

[3 9]  

[3 10]  

[4 5]  

[4 6]  

[4 7]  

[4 8]  

[4 9]  

[4 10]  

[5 6]  

[5 7]  

[5 8]  

[5 9]  

[5 10]  

[6 7]  

[6 8]  

[6 9]  

[6 10]  

[7 8]  

[7 9]  

[7 10]  

[8 9]  

[8 10]  

[9 10]  

3  digits: 

[1 2 3]  

[1 2 4]  

[1 2 5]  

[1 2 6]  

[1 2 7]  

[1 2 8]  

[1 2 9]  

[1 2 10]  

[1 3 4]  

[1 3 5]  

[1 3 6]  

[1 3 7]  

[1 3 8]  

[1 3 9]  

[1 3 10]  

[1 4 5]  

[1 4 6]  

[1 4 7]  

[1 4 8]  

[1 4 9]  

[1 4 10]  

[1 5 6]  

[1 5 7]  

[1 5 8]  

[1 5 9]  

[1 5 10]  

[1 6 7]  

[1 6 8]  

[1 6 9]  

[1 6 10]  

[1 7 8]  

[1 7 9]  

[1 7 10]  

[1 8 9]  

[1 8 10]  

[1 9 10]  

[2 3 4]  

[2 3 5]  

[2 3 6]  

[2 3 7]  

[2 3 8]  

[2 3 9]  

[2 3 10]  

[2 4 5]  

[2 4 6]  

[2 4 7]  

[2 4 8]  

[2 4 9]  

[2 4 10]  

[2 5 6]  

[2 5 7]  

[2 5 8]  

[2 5 9]  

[2 5 10]  

[2 6 7]  

[2 6 8]  

[2 6 9]  

[2 6 10]  

[2 7 8]  

[2 7 9]  

[2 7 10]  

[2 8 9]  

[2 8 10]  

[2 9 10]  

[3 4 5]  

[3 4 6]  

[3 4 7]  

[3 4 8]  

[3 4 9]  

[3 4 10]  

[3 5 6]  

[3 5 7]  

[3 5 8]  

[3 5 9]  

[3 5 10]  

[3 6 7]  

[3 6 8]  

[3 6 9]  

[3 6 10]  

[3 7 8]  

[3 7 9]  

[3 7 10]  

[3 8 9]  

[3 8 10]  

[3 9 10]  

[4 5 6]  

[4 5 7]  

[4 5 8]  

[4 5 9]  

[4 5 10]  

[4 6 7]  

[4 6 8]  

[4 6 9]  

[4 6 10]  

[4 7 8]  

[4 7 9]  

[4 7 10]  

[4 8 9]  

[4 8 10]  

[4 9 10]  

[5 6 7]  

[5 6 8]  

[5 6 9]  

[5 6 10]  

[5 7 8]  

[5 7 9]  

[5 7 10]  

[5 8 9]  

[5 8 10]  

[5 9 10]  

[6 7 8]  

[6 7 9]  

[6 7 10]  

[6 8 9]  

[6 8 10]  

[6 9 10]  

[7 8 9]  

[7 8 10]  

[7 9 10]  

[8 9 10]  


175 combinations

单个池的变化是:


package main


import "fmt"


func rPool(p int, n []int, c []int, cc [][]int) [][]int {

    if len(n) == 0 || p <= 0 {

        return cc

    }

    p--

    for i := range n {

        r := make([]int, len(c)+1)

        copy(r, c)

        r[len(r)-1] = n[i]

        if p == 0 {

            cc = append(cc, r)

        }

        cc = rPool(p, n[i+1:], r, cc)

    }

    return cc

}


func Pool(p int, n []int) [][]int {

    return rPool(p, n, nil, nil)

}


func main() {

    pool := 9

    numbers := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

    p := Pool(pool, numbers)

    fmt.Println(pool, "digit pool", "for", "numbers", numbers)

    for i := range p {

        fmt.Println(p[i])

    }

}

输出:


9 digit pool for numbers [1 2 3 4 5 6 7 8 9 10]

[1 2 3 4 5 6 7 8 9]

[1 2 3 4 5 6 7 8 10]

[1 2 3 4 5 6 7 9 10]

[1 2 3 4 5 6 8 9 10]

[1 2 3 4 5 7 8 9 10]

[1 2 3 4 6 7 8 9 10]

[1 2 3 5 6 7 8 9 10]

[1 2 4 5 6 7 8 9 10]

[1 3 4 5 6 7 8 9 10]

[2 3 4 5 6 7 8 9 10]


查看完整回答
反对 回复 2021-12-07
  • 1 回答
  • 0 关注
  • 157 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信