使用k大小的字母列表

时间:2016-11-03 07:37:32

标签: php algorithm

有人能帮帮我吗?我正在尝试找到公式并用PHP语言编写一段代码,这使得下一个

想象一下,我们有3种类型的东西,k = 1,2,3,这个数字的长度可以是各种(n长度),但相邻类型不应该(!)相同 - 1,1或2 ,2

例如 k = 1,2,3 n = 5

输出 1,2,3,1,2 | 1,2,3,1,3 | 1,2,3,2,1 | 1,2,3,2,3 |

1,3,2,1,3 | 1,3,2,1,2 | 1,3,2,1,3 | 1,3,2,3,1 | 1,3,2,3,2 .........

这是一个常见的命名问题,请与我分享,我会尽量找到一些资源

由于

2 个答案:

答案 0 :(得分:0)

你在循环中做一个循环。由于k具有长度,并且k变量中的数字是您移动的数字,因此它们呈现外部循环。 (for loop) 现在你可以沿输出运行,因为你也知道数字n。 你将k [1]作为n [1]的第一个变量,并且在内循环结束之前它不会改变。 (在这种情况下,k [1]是1)。现在你做一个while循环,带有一个可更改的(例如)变量,该变量在创建的n数组上运行。 n将是(1,null,null,null,null)。而a!= n.lenth()。你检查n(a-1)的值是否确定不一样。每当达到n.length时,你改变k数组上下一个数字的最后一个数字的值,然后你回到2个点(n [a-1])并改变它然后返回,一直去追求从一开始直到所有斑点都被改变并且阵列的n [2]具有k阵列的最高值。为了让生活变得更轻松,你可以创建一个新的数组,让我们为这个问题分配j,一旦最近的n [a]点获得最后一个值,它就会得到一个值。

顺便说一下,每当你返回时,将你运行的斑点的值重置为空,这样k数组中的所有数字都是可选的。当j数组已满时,重置所有数组并在for循环中继续。

希望我有所帮助,如果您有任何问题可以随时提出

答案 1 :(得分:0)

生成此类列表的最简单方法是递归的(如果n,k不大 - 注意变量计数为k *(k-1) n-1 )。

伪代码:

Generate(list, n, k, lastvalue)
    if (list.length = n)
          output(list)
    else
          for i = 1 .. k
              if (i != lastvalue)
                  Generate(list + i, n, k, i)

Delphi代码

procedure Generate(list: string; n, k, lastvalue: Integer);
var
  i: Integer;
begin
    if (Length(list) = n) then
          Memo1.Lines.Add(list)
    else
          for i := 1  to k do
              if (i <> lastvalue) then
                  Generate(list + IntToStr(i), n, k, i)
end;

begin
  Generate('', 4, 3, 0);

n = 4,k = 3

的输出
1212  1213  1231  1232  1312  1313  1321  1323  
2121  2123  2131  2132  2312  2313  2321  2323
3121  3123  3131  3132  3212  3213  3231  3232