我想编写一个函数,生成长度 n 的所有二进制模式,并设置 k 位。模式可以存储在二维阵列中。看起来我需要递归来实现这一目标。任何代码或伪代码都会有所帮助。
示例:如果n = 5且k = 3,则生成:
111 00
的 11 0的 1 0
的 11 00 1
的 1 0的 11 0
的 1 0的 1 0的 1
的 1 00的 11
0的 111 0
0的 11 0的 1
000的 11
00的 111
我发现了类似帖子:Generate all binary strings of length n with k bits set,但建议的解决方案计算所有2 ^ k组合。
答案 0 :(得分:0)
For i = 0...(1<<n)-1
If countsetbits(i) == k
Store into collection
countsetbits(i)
的位置:
j = i
For b = 0...n
If j == 0
Return b
j = j And (j - 1)
用你的例子,其中
n = 5, k = 3
你得到了
i b j=0? j And(j-1) Return b Main loop
0...6 less than k
7 0 No 111b And 110b = 110b
1 No 110b And 101b = 100b
2 No 100b And 011b = 000b
3 Yes 3 k, hence store into collection
8 0 No 1000b And 0111b = 0000b
1 Yes 1 less than k
9 0 No 1001b And 1000b = 1000b
1 No 1000b And 0111b = 0000b
2 Yes 2 less than k
10 0 No 1010b And 1001b = 1000b
1 No 1000b And 0111b = 0000b
2 Yes 2 less than k
11 0 No 1011b And 1010b = 1010b
1 No 1010b And 1001b = 1000b
2 No 1000b And 0111b = 0000b
3 Yes 3 k, hence store into collection
...
31 ... 5 greater than k
答案 1 :(得分:0)
这个任务的递归实现非常简单(Delphi和伪代码)
procedure GenKBits(Value, Position, N, K: Integer);
begin
if K = 0 then
Output Value in binary
else
if (Position < N) then begin
GenKBits(Value or (1 shl Position), Position + 1, N, K - 1); //set bit
GenKBits(Value, Position + 1, N, K); //use zero bit
end;
end;
call GenKBits(0, 0, 4, 2) gives
0011
0101
1001
0110
1010
1100