2014-11-05 58 views
0

我想弄清楚如何编写一个函数,它需要两个整数,n和k,并且找到所有严格递减的从0到n的整数长度k的序列。查找长度为k的所有递减序列的列表?

例如,allDecreasing(5,3)返回

[[4,3,2],[4,3,1],[4,3,0],[4,2, 1],[4,2,0],[4,1,0],[3,2,1],[3,2,0],[3,1,0],[2,1,0] ]

到目前为止,我只有:

function all-decreasing(n, k) { 
    if (n > k-1) { 
     all-decreasing(n-1, k); 
    } 
} 

它的并不多,因为我不太知道如何处理迭代的一部分。置换和子集算法一直困扰着我。如果有人可以给我一个关于如何开始的想法,那将不胜感激!谢谢。

+0

从范围中选择n个整数,排序。要选择每个这样的集合一次,有许多实现,请参见[这里](http://stackoverflow.com/questions/4504974/how-to-iteratively-generate-k-elements-subsets-from-a-set-例如java中的size-n-in-size)。 – 2014-11-05 11:02:20

回答

0

Delphi版本。我希望你能看到逻辑

procedure alldecreasing(n, k: Integer; s: string); 
var 
    i: Integer; 
begin 
    if k = 0 then 
    Output(s) 
    else 
    for i := n - 1 downto k - 1 do 
     alldecreasing(i, k - 1, s + IntToStr(i)); 
end; 

a call: 
    alldecreasing(5, 3, ''); 
gives: 
432 
431 
430 
421 
420 
410 
321 
320 
310 
210 
0

你应该考虑一下像

问题(3/5)的问题 - 5个号码,3真,2个假

4 3 2 1 0 
--------- 
1 1 1 0 0 = 4 3 2 (flip) 
1 1 0 1 0 = 4 3 1 (flip) 
1 1 0 0 1 = 4 3 0 (flip)(reset 1) 
1 0 1 1 0 = 4 2 1 (flip) 
1 0 1 0 1 = 4 2 0 (flip) 
1 0 0 1 1 = 4 1 0 (flip)(reset 2) 
0 1 1 1 0 = 3 2 1 (flip) 
0 1 1 0 1 = 3 2 0 (flip) 
0 1 0 1 1 = 3 1 0 (flip) 
0 0 1 1 1 = 2 1 0 (flip) 

基本操作你需要能够做的是:

  • 找到最右边(10),翻盖(10)又名(翻转)
  • 如果不是最右边的1,复位1周的后又名(复位N)

这将非常有效地开展工作可笑的大集。