我从来没有太多的数学,我希望有人可以帮助我解决以下问题。
我有5个盒子:
1 2 3 4 5
[ ] [ ] [ ] [ ] [ ]
这些框可以是白色、灰色或黑色(或将其视为 0、1、2)
盒子集合可以有多少种可能的状态?
生成所有可能结果的伪代码(或任何语言)是什么?
IE...
00000
00001
00011
00111
等等等等……
我真的很感谢任何人可以为此提供的任何帮助。
我从来没有太多的数学,我希望有人可以帮助我解决以下问题。
我有5个盒子:
1 2 3 4 5
[ ] [ ] [ ] [ ] [ ]
这些框可以是白色、灰色或黑色(或将其视为 0、1、2)
盒子集合可以有多少种可能的状态?
生成所有可能结果的伪代码(或任何语言)是什么?
IE...
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);
}
}
要回答您的第一个问题,如果这些框只能包含两个值中的一个,答案会是什么?那么,如果这些框包含三个值之一,答案是什么?
要回答您的第二个问题,什么伪代码会生成一个盒子的所有可能结果?现在,伪代码生成两个框的所有可能结果?
我建议先在纸上解决问题。尝试用较少数量的盒子(也许三个)来解决它,并列出所有可能性。然后,想想你的推理是如何进行的,或者你会如何向一个小孩解释你做了什么。
这似乎是一个家庭作业问题。那我就给你一些关于解决方案的帮助。
你说的是每个盒子都有三个状态,它们都是独立的。一个盒子有 3 个解决方案,两个盒子有 3 * 3 个解决方案 - 对于第一个盒子的每个状态,第二个盒子也有三个状态。将其扩展到 5 个盒子。
要生成每个解决方案,您可以循环浏览它。很容易为每个盒子制作嵌套的 for 循环,乘以 10 的幂可以让你一次显示数字。
您可以以类似的方式概括多个框的代码。
谢谢大家的回答,至少是那些真正给我答案的人。
虽然我可以理解这个问题听起来像是直接从计算机科学 101 中提取出来的,但事实并非如此。具有讽刺意味的是,这是在真正的截止日期前的现实生活,我没有时间回想当我被教这些东西并对自己说:“我什么时候需要这个废话”
如果我想像小学生一样受到光顾和对待,我会回到我的小学,问我五年级的老师我是否可以去洗手间
再次感谢
可能性的数量是 3 的 5 次方
如果您从 0 循环到该数字 - 1 并以基数 3 表示它,您将拥有所有可能性(请记住在必要时添加 0)
在红宝石中:
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^5。
伪代码是
for value from 0 to 3^5-1
print base3(value)
其中 base3 是一个函数,它反复取模 3 来获得一个数字,然后删除该数字(除以 3)
提示:想象每个方框是一个数字中的一个位置,每种颜色是一个不同的数字。在现实世界中,2 个位置和 10 个可能的数字有多少种组合(包括零)?3个职位呢?给定您可用的位数,添加额外位置和组合数量之间有什么关系?
唯一组合数: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,正如您已经知道的那样。
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);
}
}