[英]How do I calculate permutations where order matters and sets are different lengths?
[英]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.