![](/img/trans.png)
[英]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.