我正在尝试在三个位置生成A,B,C,D,E的所有组合:
A,A,A
A,A,B
C,A,E
C,B,A
C,B,B
etc...
我已经学习了阶乘数系统和组合数系统,但是我仍然坚持寻找正确的实现。通常,过去我使用递归来解决此问题,但是在这种情况下,我不想生成整个列表来查找一个值,因此我需要编码。
理想情况下,我为组合使用了整数编码,因此我可以简单地调用带有迭代整数的函数来生成正确的排列。
这又叫什么?我如何才能了解有关方法变化的更多信息?我见过的一些类似解决方案仅生成非重复组合(ABC,ABD),而其他解决方案则不重复使用值。
基于我过去的递归方法,我的猜测是permutation(0)
将导致aaa
,而permutation(100)
将导致adw
。
答案 0 :(得分:1)
您要查找的特定组合似乎只是“每个位置上的A,B,C,D,E中的任何一个”。 在这种情况下,它们很像一个“五进制”(以5为底)positional numeral system:您有3个数字,并且每个数字都可以分别是0(A),1(B),2(C),3 (D)或4(E)。 将它们编码为整数也是如此:只需将它们从0编号为5 3 -1。
对于数字k,“组合”是“(k div 5 2 )mod 5,(k div 5 1 )mod 5,(k div 5 0 )mod 5,其中ABCDE
分别编码为01234
。
对于“ xyz”之类的“组合”,首先将字母ABCDE
映射到数字01234
作为x,y和z,然后编码编号为x * 5 2 < / sup> + y * 5 1 + z * 5 0 。