C# 使用递归获得C中等于相同和的数的组合

C# 使用递归获得C中等于相同和的数的组合,c#,recursion,C#,Recursion,更新:好吧,我修改了这个问题,因为一些消极的人只是想抱怨,而不是试图提供一些建设性的帮助 我知道有人问过不同的问题,但我相当肯定我的问题是不同的 我正在尝试做一些类似于tic-tac-toe魔术盒的事情,但有一个变化 传统上,神奇的Tictaoe框指的是数字1-9,你被要求在Tictaoe框中排列它们,这样3个集合的每次迭代都相等。从这个意义上讲,每运行3个数字必须等于15。对于每个可能的方向,有8个序列需要测试。计算的重要部分是1-9的总和是45,再除以3,3的每次运行应该等于15 现在,据我

更新:好吧,我修改了这个问题,因为一些消极的人只是想抱怨,而不是试图提供一些建设性的帮助

我知道有人问过不同的问题,但我相当肯定我的问题是不同的

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

传统上,神奇的Tictaoe框指的是数字1-9,你被要求在Tictaoe框中排列它们,这样3个集合的每次迭代都相等。从这个意义上讲,每运行3个数字必须等于15。对于每个可能的方向,有8个序列需要测试。计算的重要部分是1-9的总和是45,再除以3,3的每次运行应该等于15

现在,据我所知,有一种形式的递归,必须通过数字的组合运行,但我不太确定如何做到这一点。我希望能够把一个可以被3和9整除的数字作为输入,让它不仅能确定达到这个总数所需的唯一非重复性数字,还能确定这些数字应该如何使用

例如: 我知道我可以简单地将一个数字除以9来确定中位数,在这个例子中,它已经给了我一个字母,在这个例子中是E。我知道我可以简单地运行几个for循环来获得剩余的数字。我不确定该怎么做的是找出递归过程来确定每个数字的正确赋值

下面是字母赋值的示例:

G  |  F  |  A
H  |  E  |  B
I  |  D  |  C
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
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
现在,我不确定的是,每个数字的使用频率,以及它可能产生的影响。我知道上面的每个序列都需要等于输入的数字除以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,以此类推。

给你。把你自己弄昏

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));

我理解@tekGiant的问题,但我不知道如何回答

您需要以下组合:

A+B+C
F+E+D
G+H+I
A+E+I
G+E+C
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是您指定的每个不同组合的总和的初始数字。

您要求的是多个东西。例如,要确定数字系列,只需将输入除以9。这给了你9位数序列的中间点。现在把所有的数字从比中间点少4到比中间点多4,你有你的9个数字系列要用。你的另一部分用这些9个数字系列来确定幻方排列。你的问题似乎是,请给我写一些X的代码。你能制定一个你想要答案的实际问题吗?然后把它写在你的标题里。这是一个很好的例子。我真的很感激。不过,我想知道的是,我需要调整或改变什么才能用任何一组数字做到这一点。如我的例子所示。如果我有一个90的输入,它会给出一个数字列表:6,7,8,9,10,11,12,13,14,我问,因为我创建了一些代码来计算数字列表,我想知道我如何调整你在那里用ch做的
如果可能的话,将范围更改为数字列表?此外,我如何循环结果,以您在此处显示的方式输出它们?我尝试在调试期间查看本地人查看的结果,但弹出超时错误。我试图创建一个foreach语句,循环遍历结果,但是,也许我不理解在创建数字变体时结果是如何存储的。@TekGiant-我不知道如果我有一个90的输入,它将给出一个数字列表:6,7,8,9,10,11,12,13,14?Console.WriteLineString.JoinEnvironment.NewLine+Environment.NewLine,results.Selectx=>String.JoinEnvironment.NewLine,new[]{String.Join,x.Take3,String.Join,x.Skip3.Take3,String.Join,x.Skip6.Take3,};我本可以说得更清楚。我的意思是,举个例子。从1到9,每一个加在一起,产生45的总和。45/9,中位数为5。这就是我最初打算自己解决这个问题的方法。因为中位数永远是中心数,所以我需要计算出9个数字中的1个。所以,我的目标是,输入一个可以被3和9整除的数字,即45,90,108之类的数字,然后从9个数字中得到可能的结果,这9个数字的总和等于用户输入的数字。我做了编辑。