【发布时间】:2017-06-30 19:43:37
【问题描述】:
我正在尝试创建一个能够从给定范围生成组合的程序。
我开始编辑以下生成组合的代码:
package main
import "fmt"
func nextPassword(n int, c string) func() string {
r := []rune(c)
p := make([]rune, n)
x := make([]int, len(p))
return func() string {
p := p[:len(x)]
for i, xi := range x {
p[i] = r[xi]
}
for i := len(x) - 1; i >= 0; i-- {
x[i]++
if x[i] < len(r) {
break
}
x[i] = 0
if i <= 0 {
x = x[0:0]
break
}
}
return string(p)
}
}
func main() {
np := nextPassword(2, "ABCDE")
for {
pwd := np()
if len(pwd) == 0 {
break
}
fmt.Println(pwd)
}
}
这是代码的输出:
AA
AB
AC
AD
AE
BA
BB
BC
BD
BE
CA
CB
CC
CD
CE
DA
DB
DC
DD
DE
EA
EB
EC
ED
EE
这是我编辑的代码:
package main
import "fmt"
const (
Min = 5
Max = 10
)
func nextPassword(n int, c string) func() string {
r := []rune(c)
p := make([]rune, n)
x := make([]int, len(p))
return func() string {
p := p[:len(x)]
for i, xi := range x {
p[i] = r[xi]
}
for i := len(x) - 1; i >= 0; i-- {
x[i]++
if x[i] < len(r) {
break
}
x[i] = 0
if i <= 0 {
x = x[0:0]
break
}
}
return string(p)
}
}
func main() {
cont := 0
np := nextPassword(2, "ABCDE")
for {
pwd := np()
if len(pwd) == 0 {
break
}
if cont >= Min && cont <= Max{
fmt.Println(pwd)
} else if cont > Max{
break
}
cont += 1
}
}
输出:
BA
BB
BC
BD
BE
CA
我的代码有效,但是如果我增加组合的长度并且我的范围从中间开始,程序甚至会生成我不想要的组合(当然这会花费很多时间)。 我该如何解决这个问题?
【问题讨论】:
-
您能否将其缩减为重现该问题所需的最少代码,并澄清问题究竟是什么?
-
你修改了
nextPassword函数吗?呃,写这个函数的人要么故意混淆它,要么急需学习有用的变量名。
标签: go combinations