使用递归来获得C#中的数字组合,它们的总和相同

时间:2015-08-06 22:50:15

标签: c# recursion

更新:好的,我已经修改了这个问题,因为一些负面的人只是想抱怨而不是试图提供某种建设性的帮助。

我知道这个问题的变化已被问到,但我很确定我的不同。

我正在尝试做一些类似于魔术盒的tic tac toe,但有一个变化。

传统上,Magic TicTacToe框指的是数字1-9,你被要求在tictactoe框中排列它们,使得3组的每次迭代都相同。从这个意义上说,每次运行3个数字必须等于15.每个可能的方向,都有8个序列要测试。计算的重要部分是1-9的总和是45,除以3就是告诉你每次运行3应该等于15。

现在,据我所知,有一种递归形式可以通过数字组合来运行,但我不太清楚如何做到这一点。我希望能够输入一个数字(可被3和9整除)作为输入,并且它不仅可以确定获得该总数所需的唯一(非重复)数字,而且这些数字应该如何使用

实施例: 我知道我可以简单地将数字除以9以确定中位数,在这种情况下已经给了我一个字母,在这种情况下它将是E.我知道我可以简单地运行一对for循环来获取剩余的数字。我不知道该怎么做是找出递归过程来确定每个数字的正确分配。

以下是字母分配的示例:

G  |  F  |  A
H  |  E  |  B
I  |  D  |  C

您需要以下组合:

A+B+C
F+E+D
G+H+I
A+E+I
G+E+C
G+F+A
H+E+B
I+D+C

现在,我不确定的,以及它可能产生的影响,是每个数字的使用频率。我知道上面的每个序列都需要等于数字输入除以3,在这种情况下将是30,但我不确定哪些重要事实可用于创建正确的嵌套for循环和/或if语句对所创建的数字列表或数组进行排序,并根据它们的相关性正确分配它们。

考虑到E使用4次(这就是为什么它是中心),A,C,I和G使用3次,H,B,D和F使用2次。

因此,为了澄清,我希望所有这些都能输出A,B,C等应该等于给定的限制。

感谢您的帮助。 作为一个额外的请求,虽然不是必需的,但非常感激 - 如果你确实提供了一个答案,解释一些重要的递归部分,使用的函数以及它如何实现我想要的结果将会很棒。

我想我此时已经提出了我的问题。关于某人的评论,是的,我要求代码,因为我不够精通,无法弄清楚递归的复杂使用,需要不断检查所需的约束,并且两个,没有其他问题真正进入我觉得我想去的那种细节。大多数只是组合和排列的正常统计使用,但似乎没有对结果有太多限制,和/或它们的最终目标是不同的。

为了清楚说明,这是另一个编辑:

以下是我必须首先生成将要使用的所有数字的列表。

        int A, B, C, D, E, F, G, H, I;
        Console.WriteLine("Choose a number that's all 9 spots added together.");
        Console.WriteLine("Make sure the number is divisble by 3 and 9.");
        int myNumber = int.Parse(Console.ReadLine());
        int sums = myNumber / 3;
        E = myNumber / 9;
        if (E%1 != 0)
        {
            Console.WriteLine("You did not enter a value divisible by 3 and 9");
            Console.WriteLine("Try again.");
            Console.ReadLine();
        }

        else
        {
            List<int> list = new List<int>();
            int lowest = E - 4;
            for (int x = lowest;x < E; x++)
            {

                list.Add(x);
            }
            int highest = E + 4;
            for (int y=E;y<highest;y++)
            {
                list.Add(y+1);
            }

            //Testing output

            foreach (int i in list)
            {
                Console.WriteLine(i);
            }

我首先看看我是否可以建立将要使用的数字,然后查找数字的所有变化,这将使所有线条相同。例如:如果他们输入45,所有方向必须等于15;如果他们进入90,所有方向都必须等于30等。

2 个答案:

答案 0 :(得分:0)

你走了。把自己弄出来。

Func<IEnumerable<int>, IEnumerable<int[]>> permutate = null;
permutate = ns =>
{
    if (!ns.Skip(1).Any())
    {
        return new [] { ns.ToArray() };
    }
    else
    {
        return
            from n in ns
            from ns2 in permutate(ns.Except(new [] { n }))
            select new [] { n }.Concat(ns2).ToArray();
    }
};

var results =
    permutate(Enumerable.Range(1, 9))
        .Where(ns => Enumerable.Range(0, 3).All(n => ns[n * 3] + ns[n * 3 + 1] + ns[n * 3 + 2] == 15))
        .Where(ns => Enumerable.Range(0, 3).All(n => ns[n] + ns[3 + n] + ns[6 + n] == 15))
        .Where(ns => Enumerable.Range(0, 3).All(n => ns[0] + ns[4] + ns[8] == 15))
        .Where(ns => Enumerable.Range(0, 3).All(n => ns[2] + ns[4] + ns[6] == 15));

这给出了:

2, 7, 6
9, 5, 1
4, 3, 8

2, 9, 4
7, 5, 3
6, 1, 8

4, 3, 8
9, 5, 1
2, 7, 6

4, 9, 2
3, 5, 7
8, 1, 6

6, 1, 8
7, 5, 3
2, 9, 4

6, 7, 2
1, 5, 9
8, 3, 4

8, 1, 6
3, 5, 7
4, 9, 2

8, 3, 4
1, 5, 9
6, 7, 2

答案 1 :(得分:0)

我明白@tekGiant正在问什么,但我不知道如何回答......

G  |  F  |  A
H  |  E  |  B
I  |  D  |  C

您需要以下组合:

A+B+C=X
F+E+D=X
G+H+I=X
A+E+I=X
G+E+C=X
G+F+A=X
H+E+B=X
I+D+C=X

其中X是您指定为每个不同组合加起来的初始数字。