繁体   English   中英

我如何计算以3为基础的组合的排列数量?

[英]How do I calculate the number of permutations in base 3 combinatorics?

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

我有5个盒子:

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

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

盒子套装可以处于多少种状态?

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

即...

00000
00001
00011
00111

等,等等。

我真的很感谢任何人都可以给我的帮助。

组合数量的答案是: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

这是经典的排列生成问题。 每个职位有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);
    }
}

要回答您的第一个问题,如果盒子只能包含两个值之一,答案是什么? 那么,如果盒子包含三个值之一,答案是什么?

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

我建议先在纸上解决问题。 尝试用较少数量的盒子(也许是三个)解决问题,并列出所有可能性。 然后,考虑一下您的推理方式,或如何向小孩解释您的所作所为。

谢谢大家的回答,至少是那些实际给我的回答。

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

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

再次感谢

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

的可能性是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

这似乎是一个作业问题。 然后,我将为您提供有关解决方案的帮助。

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

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

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

状态数是3 ^ 5。

伪代码是

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

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

提示:假设每个框是数字中的一个位置,每种颜色是一个不同的数字。 在现实世界中,使用2个位置和10个可能的数字可以获得多少组合(包括零)? 那三个职位呢? 给定可用位数,添加额外头寸与组合数量之间有什么关系?

唯一组合数: 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
}

这是我第一次学习如何做到这一点的方法:首先考虑一下您正在做出多少选择。 您正在做出五个选择,每个框一个。 因此,写下五个带有乘法符号的空白行:

__ x __ x __ x __ x __ = ?

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

3 x 3 x 3 x 3 x 3 = 243

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

我可以问一下您不了解的事情吗? 我看到这里的每个人都只是回答了这个问题,但是如果您复制了他们的答案,那么您将一无所知,从而完全错过了功课的重点。 假设您的下一课在此基础上进行,您将进一步落后。

如果您是为我工作或在我的课堂上,我只需询问以下内容...

“您认为应该如何解决该问题?” 答案可能揭示您正在挂断电话。 我在CMU的一位明智的教授曾经说过:“直到您知道您不了解的内容,我都无法帮助您理解这一点。”我从来没有弄清楚自己不了解的内容,因此我放弃了他的课程,但这一课程坚持了下来我。

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

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

您的问题只需要组合规则中的乘积规则即可

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM