我的代码列出了6个长度的数字组合,但它在4-5-6-7-8-9处停止。我需要它继续并在第一列达到9时停止。我已经尝试了很多方法,但无法解决问题。
static void Main()
{
Console.Write("n = ");
var n = int.Parse(Console.ReadLine());
Console.Write("k = ");
var k = int.Parse(Console.ReadLine());
foreach (var combo in Combinations(k, n))
{
Console.WriteLine(string.Join(", ", combo));
}
Console.ReadLine();
}
private static IEnumerable<int[]> Combinations(int k, int n)
{
var result = new int[k];
var stack = new Stack<int>();
stack.Push(1);
while (stack.Count > 0)
{
var index = stack.Count - 1;
var value = stack.Pop();
while (value <= n)
{
result[index++] = value++;
stack.Push(value);
if (index == k)
{
yield return result;
break;
}
}
}
}
答案 0 :(得分:0)
我建议将你的长度(k)缩短到2并将你的范围(n)缩小到3,以便你可以更好地掌握你的程序正在做什么以及为什么它缺少值。我怀疑你的情况while (stack.Count > 0)
可能是错误的条件。您可能需要循环使用第一个数字1到n,或者除此之外。也许你需要在开始时将1到N推入堆栈而不是仅仅1?在任何情况下,如果您将问题缩小,您应该能够更好地理解问题。我不想剥夺你的学习经历。 :)
程序的输出k = 2且n = 3
1, 2
1, 3
2, 3
希望这可以帮助您了解您所缺少的内容。你忽略了在2,3之前输出2,1。你不能总是假设所有的值都只是像你的代码那样增加。