草庐IT

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

coder 2023-07-01 原文

我正在尝试弄清楚这个递归函数。我有一个 non-recursive demo that works但它使用非递归的静态方法。这些函数打印出“pool_size”中“number sets”的所有组合。如果有人可以,请帮助我使这个函数递归,那会很棒。

package main

import (
    "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)
}

最佳答案

例如,

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]

关于recursion - 在golang中创建数字组合的递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35233717/

有关recursion - 在golang中创建数字组合的递归函数的更多相关文章

  1. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  2. ruby-on-rails - 在 ruby​​ 中使用 gsub 函数替换单词 - 2

    我正在尝试用ruby​​中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了

  3. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  4. ruby-on-rails - Rails - 从另一个模型中创建一个模型的实例 - 2

    我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案

  5. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  6. ruby - 如何在 Ruby 中创建无类 DSL? - 2

    我正在尝试找出如何为我的Ruby项目创建一种“无类DSL”,类似于在Cucumber步骤定义文件中定义步骤定义或在Sinatra应用程序中定义路由。例如,我想要一个文件,其中调用了我的所有DSL函数:#sample.rbwhen_string_matches/hello(.+)/do|name|call_another_method(name)end我认为用我的项目特有的一堆方法污染全局(内核)命名空间是一种不好的做法。因此方法when_string_matches和call_another_method将在我的库中定义,并且sample.rb文件将以某种方式在我的DSL方法的上下文中

  7. ruby-on-rails - 如何在 Rails 3 中创建自定义脚手架生成器? - 2

    有这些railscast。http://railscasts.com/episodes/218-making-generators-in-rails-3有了这个,你就会知道如何创建样式表和脚手架生成器。http://railscasts.com/episodes/216-generators-in-rails-3通过这个,您可以了解如何添加一些文件来修改脚手架View。我想把两者结合起来。我想创建一个生成器,它也可以创建脚手架View。有点像RyanBates漂亮的生成器或web_app_themegem(https://github.com/pilu/web-app-theme)。我

  8. ruby - 为什么在 ruby​​ 中创建 Rational 不需要新方法 - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Rubysyntaxquestion:Rational(a,b)andRational.new!(a,b)我正在阅读ruby镐书,我对创建有理数的语法感到困惑。Rational(3,4)*Rational(1,2)产生=>3/8为什么Rational不需要new方法(我还注意到例如我可以在没有new方法的情况下创建字符串)?

  9. 区块链之加解密算法&数字证书 - 2

    目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非

  10. ruby - 在 Ruby 中按名称传递函数 - 2

    如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只

随机推荐