我正在寻找一个算法或伪代码的提示,这有助于我计算序列。 这是一种排列,但不完全是因为它不是固定的长度。 输出序列应如下所示:
A
B
C
D
AA
BA
CA
DA
AB
BB
CB
DB
AC
BC
CC
DC
AD
BD
CD
DD
AAA
BAA
CAA
DAA
...
上面的每个字符实际上都代表一个整数,它从最小值增加到最大值。 我开始时不知道深度,所以只使用多个嵌套for循环将无效。
在德国已经很晚了,我无法绕过这个问题。很确定它可以通过for循环和递归来完成,但我目前还没有关于如何开始的线索。
有什么想法吗?
编辑:B-typo纠正。
答案 0 :(得分:1)
看起来你正在使用长度为1,2,3等的四个不同数字的所有组合,允许重复。
首先从长度1开始:{A,B,C,D}
要获得长度2,请将A,B,C,D依次添加到长度为1的每个成员中。(16个元素)
要获得长度3,请将A,B,C,D依次添加到长度为2的每个成员中。(64个元素)
要获得长度4,请将A,B,C,D依次添加到长度为3的每个成员中。(256个元素)
等等。
如果您有更多或更少的数字,相同的方法将起作用。如果你允许A比较等于B,那会变得有点棘手,但这看起来不像你现在正在做的那样。
答案 1 :(得分:0)
你的序列看起来更像(A n-1 XA T ),其中A是矩阵,A T 是它的转置。 / p>
A= [A,B,C,D]
A T X A n-1 ∀(n = 0)
序列= A,B,C,D
A T X A n-1 ∀(n = 2)
序列= AA,BA,CA,DA,AB,BB,CB,DB,AC,BC,CC,DC,AD,BD,CD,DD
您可以使用任何矩阵乘法代码,例如this并实现您想要的内容。
答案 2 :(得分:0)
你有4个元素,你只是用反向的基数4表示法循环数字。假设A = 0,B = 1,C = 2,D = 3:
首先从0到3循环1位数
2位数字从00到33的第二个循环
等等
i reversed i output using A,B,C,D digits
loop on 1 digit
0 0 A
1 1 B
2 2 C
3 3 D
loop on 2 digits
00 00 AA
01 10 BA
02 20 CA
03 30 DA
10 01 AB
11 11 BB
12 21 CB
13 31 DB
20 02 AC
21 12 BC
22 22 CC
...
算法非常明显。您可以在fascicle 3a TAOCP D. Knuth中查看算法L(词典t组合生成)。
答案 3 :(得分:0)
根据OP的评论,这里是一种在不存储列表的情况下执行序列的方法。
使用里程表类比。这只需要跟踪指数。每次序列的第一个成员循环时,向右递增一个。如果这是第一次序列成员循环,那么在序列中添加一个成员。
增量需要级联。这相当于从99,999到100,000英里(逗号是数千个标记)。
如果你有一千个需要循环的整数,那么假装你正在看1000基础的里程表,而不是上面的10基础。
答案 4 :(得分:0)
怎么样:
Private Sub DoIt(minVal As Integer, maxVal As Integer, maxDepth As Integer)
If maxVal < minVal OrElse maxDepth <= 0 Then
Debug.WriteLine("no results!")
Return
End If
Debug.WriteLine("results:")
Dim resultList As New List(Of Integer)(maxDepth)
' initialize with the 1st result: this makes processing the remainder easy to write.
resultList.Add(minVal)
Dim depthIndex As Integer = 0
Debug.WriteLine(CStr(minVal))
Do
' find the term to be increased
Dim indexOfTermToIncrease As Integer = 0
While resultList(indexOfTermToIncrease) = maxVal
resultList(indexOfTermToIncrease) = minVal
indexOfTermToIncrease += 1
If indexOfTermToIncrease > depthIndex Then
depthIndex += 1
If depthIndex = maxDepth Then
Return
End If
resultList.Add(minVal - 1)
Exit While
End If
End While
' increase the term that was identified
resultList(indexOfTermToIncrease) += 1
' output
For d As Integer = 0 To depthIndex
Debug.Write(CStr(resultList(d)) + " ")
Next
Debug.WriteLine("")
Loop
End Sub
那会足够吗?它不占用太多内存而且相对较快(除了写入输出......)。