因此,我正在为C#中的作业做一些事情,以便在每个组合中打印出人们的名字。例如,如果有5个人,我使用了5位二进制数,并在每次迭代后添加1。
<00> 00000打印没有名字 00001印第一名 00010印第二名 00011印有第一个和第二个名字......等等。最终,我可以迭代并打印出每个名字的组合。
所以,我被要求只考虑如何在添加一个名称或减去一个名称的情况下才能这样做。如果我理解这一点,我需要能够系统地打印出每个组合,但下一个打印的组合只能有一个名称,而不是最后一个名称,或者比最后一个名称少一个名称。
我正在寻找一些帮助,找出一些合乎逻辑的方法。我从这里开始:
00000 0 names
Add 1 00001 1 name
double, add 1 00011 2 names
subtract 1 00010 1 name
double, add 1 00101 2 names
subtract 1 00100 1 name
这里我没有看到一个逻辑模式,因为如果我再次加倍,我将错过00111例如所以这是不对的。无论如何,我现在卡住了。
我不需要任何代码,我可以自己写。我只是需要一个更好的逻辑的想法。我这里只选择二进制数法,因为这是我被要求思考的问题。任何想法都会很棒。谢谢
答案 0 :(得分:0)
试试这个:
var found = new HashSet<string>();
IEnumerable<string> Mutate(string current)
{
for (var i = 0; i < current.Length; i++)
{
var sb = new StringBuilder(current);
sb[i] = sb[i] == '0' ? '1' : '0';
var r = sb.ToString();
if (!found.Contains(r))
{
found.Add(r);
yield return r;
foreach (var r2 in Mutate(r))
{
yield return r2;
}
}
}
}
var results = Mutate("00000").ToArray();
输出:
10000 00000 01000 11000 11100 01100 00100 10100 10110 00110 01110 11110 11010 01010 00010 10010 10011 00011 01011 11011 11111 01111 00111 10111 10101 00101 01101 11101 11001 01001 00001 10001