列出所有可能的数字1-9的组合,不重复

时间:2018-01-08 13:58:23

标签: c#

我的代码列出了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;
            }
        }
    }
}

1 个答案:

答案 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。你不能总是假设所有的值都只是像你的代码那样增加。