这是功课
我正在开发一个项目,其中很小的一部分(非常小,一旦我开始工作,这基本上是该项目其余部分的前提条件)就是使用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能力。说“使用渠道”之类的事情对我完全没有帮助。解释是我的朋友……除了“使用渠道”外,我还没有走出我的教授的运气。
您的老师已经暗示您应该使用频道而不是返回大数组。通过这样解决,您将不必存储包含所有组合的大数据块,而只需为函数提供不同的迭代并一次处理它们即可。
我们可以看到您的老师提示,GenerateCombinations返回a chan string而不是a []string:
GenerateCombinations
chan string
[]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