小编典典

进行编程:生成组合

go

这是功课

我正在开发一个项目,其中很小的一部分(非常小,一旦我开始工作,这基本上是该项目其余部分的前提条件)就是使用Go例程生成一些组合。

因此,我拥有的代码是:

package bruteforce

// GenerateCombinations is an iterator function.  Given an alphabet and a
// length, it will generate every possible combination of the letters in
// alphabet of the specified length.
//
// It is meant to be consumed by using the range clause:
//
//  for combination := range GenerateCombinations(alphabet, length) {
//      process(combination)
//  }
//
func GenerateCombinations(alphabet string, length int) <-chan string {

GenerateCombinations(alphabet, length):
if length == 0:
    yield ""
else:
    for i := range alphabet{
        for j := range GenerateCombinations(alphabet, length-1){
            i + j
        }
    }

    return nil
}

我真的根本不明白这一点。如您所见,那里有一些讲师提供的伪代码,但是它的实现却使我不寒而栗。

示例I / O将如下所示:

如果字母为{0,1}并且密码为长度2,则它将需要生成{0,1,00,01,10,11}。

我感谢所有建议,但请注意,“初学者”一词并没有开始描述我的go能力。说“使用渠道”之类的事情对我完全没有帮助。解释是我的朋友……除了“使用渠道”外,我还没有走出我的教授的运气。


阅读 320

收藏
2020-07-02

共1个答案

小编典典

您的老师已经暗示您应该使用频道而不是返回大数组。通过这样解决,您将不必存储包含所有组合的大数据块,而只需为函数提供不同的迭代并一次处理它们即可。

我们可以看到您的老师提示,GenerateCombinations返回a chan string而不是a []string

func GenerateCombinations(alphabet string, length int) <-chan string

这也意味着该函数必须1)创建要返回的通道,以及2)启动将例程传递给该通道的goroutine。该函数如下所示:

func GenerateCombinations(alphabet string, length int) <-chan string {
    c := make(chan string)

    // Starting a separate goroutine that will create all the combinations,
    // feeding them to the channel c
    go func(c chan string) {
        defer close(c) // Once the iteration function is finished, we close the channel

        // This is where the iteration will take place
        // Your teacher's pseudo code uses recursion
        // which mean you might want to create a separate function
        // that can call itself.
    }(c)

    return c // Return the channel to the calling function
}

虽然我将实际迭代留给您,但每个循环都应导致您将组合字符串放入通道中。因为它不是缓冲通道,所以迭代函数将等待主函数读取该值,然后再继续处理下一个迭代。

包含主要功能的游乐场版本:http :
//play.golang.org/p/CBkSjpmQ0t

使用递归的完整的工作解决方案:http :
//play.golang.org/p/0bWDCibSUJ

2020-07-02