我试图弄清楚如何编写一个带有两个整数n和k的函数,并找到从0到n的整数长度为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 :(得分: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
答案 1 :(得分:0)
你应该考虑像
这样的问题问题(5 3) - 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)
您需要做的基本操作是:
这将非常有效地用于可笑的大集合。