【问题标题】:How do I calculate the number of permutations in base 3 combinatorics?如何计算以 3 为底的组合数中的排列数?
【发布时间】:2009-01-15 17:54:33
【问题描述】:

我从来不喜欢数学,我希望有人可以帮助我解决以下问题。

我有 5 个盒子:

 1   2   3   4   5
[ ] [ ] [ ] [ ] [ ]

这些框可以是白色、灰色或黑色(或将其视为 0、1、2)

box set 可以有多少种可能的状态?

生成所有可能结果的伪代码(或任何语言)是什么??

即...

00000
00001
00011
00111

等等等等……

我非常感谢任何人对此提供的任何帮助。

【问题讨论】:

标签: math permutation


【解决方案1】:

组合数量的答案是:3x3x3x3x3 (3^5),因为每个盒子可以有 3 种可能的颜色。

至于生成结果,看看你能不能用这个矩阵用 0、1 或 2 来表示盒子的颜色。在较小的规模上(假设 3 个盒子),它看起来像这样:

0 0 0
0 0 1
0 0 2
0 1 0
0 1 1
0 1 2
0 2 0
0 2 1
0 2 2
1 0 0
1 0 1
1 0 2
1 1 0
1 1 1
1 1 2
1 2 0
1 2 1
1 2 2
2 0 0
2 0 1
2 0 2
2 1 0
2 1 1
2 1 2
2 2 0
2 2 1
2 2 2

【讨论】:

    【解决方案2】:

    这是一个经典的排列生成问题。每个职位有 3 种可能性,以及 5 个职位。生成的字符串总数为 3^5 = 243。 如果需要通用解决方案,则需要递归(简单的迭代循环仅适用于问题的单个实例)。

    这是一个简单的例子:

    public static void Main(string[] args){
    
        Generate("", 5);
    }
    
    private void Generate(string s, int limit)
    {
        if (s.Length == limit)
            Console.WriteLine(s);
        else
        {
            Generate(s+"0", limit);
            Generate(s+"1", limit);
            Generate(s+"2", limit);
        }
    }
    

    【讨论】:

    • 甜蜜!我从来没有将递归作为我的第一个解决方案,但这很优雅。
    【解决方案3】:

    要回答您的第一个问题,如果这些框只能包含两个值中的一个,答案会是什么?那么,如果这些框包含三个值之一,答案是什么?

    要回答您的第二个问题,什么伪代码会生成一个框的所有可能结果?现在,伪代码生成两个框的所有可能结果?

    【讨论】:

      【解决方案4】:

      我建议先在纸上解决问题。尝试用较少数量的盒子(也许三个)来解决它,并列出所有可能性。然后,想想你的推理是如何进行的,或者你会如何向一个小孩解释你做了什么。

      【讨论】:

        【解决方案5】:

        这似乎是一个家庭作业问题。那我就给你一些解决方案的帮助吧。

        你的意思是每个盒子都有三个状态,它们都是独立的。一个盒子有 3 个解决方案,两个盒子有 3 * 3 个解决方案 - 对于第一个盒子的每个状态,第二个盒子也有三个状态。将其扩展到 5 个盒子。

        要生成每个解决方案,您可以循环浏览它。很容易为每个盒子做嵌套的for循环,乘以10的幂可以让你一次显示数字。

        您可以以类似的方式概括多个框的代码。

        【讨论】:

        • 这里不是给他完整的解决方案吗?
        【解决方案6】:

        谢谢大家的回答,至少是那些真正给我答案的人。

        虽然我可以理解这个问题听起来像是直接从计算机科学 101 中提取出来的,但事实并非如此。具有讽刺意味的是,这是在真正的截止日期前的现实生活,我没有时间回想当我被教这些东西并对自己说:“我什么时候需要这个废话”

        如果我想像小学生一样受到光顾和对待,我会回到我的小学并问我五年级的老师我是否可以去洗手间

        再次感谢

        【讨论】:

          【解决方案7】:

          状态数为 3^5。

          伪代码是

          for value from 0 to 3^5-1
              print base3(value)
          

          base3 是一个函数,它反复取模 3 来获得一个数字,然后删除该数字(除以 3)

          【讨论】:

            【解决方案8】:

            提示:假设每个框是一个数字中的一个位置,每种颜色是一个不同的数字。在现实世界中,2 个位置和 10 个可能的数字有多少种组合(包括零)? 3个职位呢?考虑到您可用的位数,添加额外位置和组合数量之间有什么关系?

            【讨论】:

              【解决方案9】:

              唯一组合数:3^5=243

              代码:

              n = 0
              for i = 0 to 3^5-1
              {
                  s = ""
                  for j = 1 to 5
                  {
                      d = n mod 3
                      s = toascii(d) . s
                      n = n / 3
                  }
                  println s
                  i = i + 1
              }
              

              【讨论】:

                【解决方案10】:

                这是我第一次学会这样做的方法:首先考虑一下您正在做出多少选择。您正在做出五个选择,每个框一个。所以写下五个带乘号的空行:

                __ x __ x __ x __ x __ = ?
                

                在每个空白处,写下您必须为该框选择的对象数量。由于每个框有 3 个数字可供选择,因此您在 每个 空白处写一个 3:

                3 x 3 x 3 x 3 x 3 = 243
                

                这将为您提供这些选择的排列总数。

                【讨论】:

                  【解决方案11】:

                  可能性的数量是 3 的 5 次方

                  如果你从 0 循环到那个数字减 1 并以基数 3 表示它,你将拥有所有的可能性(记得在必要时添加 0)

                  在 Ruby 中:

                  number_of_possibilities = 3**5-1
                  
                  for i in (0..number_of_possibilities)
                    base_3_number = i.to_s(3)
                    puts "%05d" % base_3_number # number formatting used to prepend 0s where necessary
                  end
                  

                  【讨论】:

                    【解决方案12】:

                    我能问一下您对此有什么不理解或者是什么让您感到困惑吗?我看到这里的每个人都只是简单地回答了这个问题,但是如果你复制他们的答案,你什么也没学到,因此完全错过了作业的重点。假设你的下一课是建立在这节课的基础上的,你只会落后得更远。

                    如果您为我工作或在我的班上,我只想问以下问题......

                    “你认为这个问题应该如何解决?”答案可能会揭示你挂断电话的地方。我在 CMU 的一位睿智教授曾经说过“我无法帮助你理解这一点,除非你知道你不明白什么”我。

                    我知道可能为时已晚,但对于这些家庭作业问题,我真的认为我们应该帮助人们学习,而不是简单地提供答案并为他们做作业。

                    【讨论】:

                      【解决方案13】:

                      您的问题只需要组合数学中的rule of product

                      第一个框的状态有3种选择,第二个框的状态有3种选择,...第 5 盒 3 种方式。您可以设置所有框的状态的方式数是所有五个(相等)方式数的乘积,即 3x3x3x3x3 = 35

                      类似的问题:在十进制系统中,您可以用 5 位数字组成多少个数字,计算前导零?也就是说,从 00000 到 99999 有多少个数字?您可以通过 10 种方式(0...9)选择第一个数字,以此类推,答案是 10x10x10x10x10 = 100000,正如您已经知道的那样。

                      【讨论】:

                        【解决方案14】:

                        甚至不要尝试编写代码来回答这个问题!原因是您需要一些非常大的数字(阶乘)来计算它。这些创建的数字比 CLR 中的任何基本类型都大得多。您可以使用此opensource library 进行计算。

                        【讨论】:

                          【解决方案15】:
                          void solve(int p=0,int n=5,int d=0)
                          {
                              if (n==p)
                              {
                                  int rev=d;
                                  int i=0;
                                  while (i<5) {
                                      cout << rev%10;
                                      rev /= 10;
                                      i++;## Heading ##
                                  }
                                  cout << endl;
                                  return;
                              }
                              for(int i=0; i<3 ; i++)
                              {
                                  solve(p+1,n, d*10 + i);
                              }
                          }
                          

                          【讨论】:

                            猜你喜欢
                            • 2023-01-10
                            • 2014-03-13
                            • 2011-12-15
                            • 1970-01-01
                            • 2018-10-24
                            • 2011-03-19
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            相关资源
                            最近更新 更多