【问题标题】:permutations with repeats algorithm with recursion具有递归的重复算法的排列
【发布时间】:2012-09-30 00:40:44
【问题描述】:

我在使用一个函数而不是使用多个函数时遇到了一些麻烦。

如果我想获得像 2^3 这样的重复排列。 permutations with repeats

得到:

000
001
101
011
100
101
110
111

我可以有这个功能:

   static void Main(string[] args)
    {
        three_permutations(2);
        Console.ReadLine();
    }


    static void three_permutations(int y)
    {

        for (int aa = 0; aa < y; aa++)
        {
            for (int bb = 0; bb < y; bb++)
            {
                for (int cc = 0; cc < y; cc++)
                {
                    Console.Write((aa));
                    Console.Write((bb));
                    Console.Write((cc));
                    Console.WriteLine();
                }
            }
        }

    }

但是做4(比如2^4),我能想到的唯一方法是:

  static void four_permutations(int y)
    {
            for (int aa = 0; aa < y; aa++)
            {
                for (int bb = 0; bb < y; bb++)
                {
                    for (int cc = 0; cc < y; cc++)
                    {
                        for (int dd = 0; dd < y; dd++)
                        {
                            Console.Write((aa));
                            Console.Write((bb));
                            Console.Write((cc));
                            Console.Write((dd));
                            Console.WriteLine();
                        }
                    }
                }
            }
     }

但我确信使用递归有更好的方法我只是不知道该怎么做。我很感激任何帮助。谢谢。

【问题讨论】:

标签: c# recursion permutation


【解决方案1】:

没有递归,并且到一个列表供以后使用,不到 10 行。

public IEnumerable<List<int>> YieldCombinationsOfN(int places, int digitMin, int digitMax)
{            
    int n = digitMax - digitMin + 1;
    int numericMax = (int)Math.Pow(n, places);

    for (int i = 0; i < numericMax; i++)
    {
        List<int> li = new List<int>(places);
        for(int digit = 0; digit < places; digit++)
        {
            li.Add(((int)(i / Math.Pow(n, digit)) % n) + digitMin);
        }
        yield return li;
    }
}

【讨论】:

    【解决方案2】:
    void permutations(string text, int numberOfDigits, int numberOfChars)
    {
        if (numberOfDigits > 0)
            for (int j = 0; j < numberOfChars; j++)
                permutations(text + j.ToString(), numberOfDigits - 1, numberOfChars);
        else textBox1.Text += text + "\r\n";
    }
    

    然后调用:

    permutations("", 3, 2);
    

    【讨论】:

    • 美丽。感谢您的帮助。
    • 那是什么textBox1.Text
    • @fubo 这是 Winforms 文本框中的文本。您可以使用任何其他方式来显示结果。比如Console.Writeline
    【解决方案3】:

    重复排列本质上是在另一个基数中计数。

    public static void Permutations(int digits, int options)
    {
        double maxNumberDouble = Math.Ceiling(Math.Pow(options, digits));
        int maxNumber = (int)maxNumberDouble;
        for (int i = 0; i < maxNumber; i++)
        {
            Console.WriteLine(Convert.ToString(i, options).PadLeft(3, '0'));
        }
    }
    

    您打印的示例实际上是从 0 到 8 以 2 为底数。

    【讨论】:

    • 此示例不考虑重复排列。每个计数的数字都是唯一的。
    • @JoelEtherton 不...例如,以 2 为底的字符串打印为 8 的结果是 111,它重复了 1 次。这依赖于这样一个事实:取多个不同的值(这里options 是选择的数量)n 次(这里的n 是digits)导致options ^ digits 的可能性;这列出了所有这些可能性。
    猜你喜欢
    • 2011-11-09
    • 2011-10-02
    • 2020-04-13
    • 2011-12-23
    • 1970-01-01
    • 2021-12-01
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多