Discussion:
問題 c(n,m)
(时间太久无法回复)
只能靜靜看著了 ...
2007-09-11 17:54:30 UTC
Permalink
排列組合幾個取幾個的程式,
n 個東西 取 m 個, n >= m
想到的寫法是用 for 迴圈,m 為幾就有幾層。可是這樣就需要預定 m

如果 m 不確定的話,感覺應該是用遞迴來寫,可是寫不出來。
有沒有高手可以示範?
--
夫兵者不祥之器物或惡之故有道者不處君子居則貴左用兵則貴右兵者不祥之器非君子
之器不得已而用之恬淡為上勝而不美而美之者是樂殺人夫樂殺人者則不可得志於天下
矣吉事尚左凶事尚右偏將軍居左上將軍居右言以喪禮處之殺人之眾以哀悲泣之戰勝以
喪禮處之道常無名樸雖小天下莫能臣侯王若能守之萬物將自賓天地相合以降甘露民莫
之令而自均始制有名名亦既有夫亦將知止知止219-81-206-10.dynamic.tfn.net.tw海
Lvx ex Caelis
2007-09-13 14:28:53 UTC
Permalink
※ 引述《starjou (只能靜靜看著了 ...)》之銘言:
Post by 只能靜靜看著了 ...
排列組合幾個取幾個的程式,
n 個東西 取 m 個, n >= m
想到的寫法是用 for 迴圈,m 為幾就有幾層。可是這樣就需要預定 m
如果 m 不確定的話,感覺應該是用遞迴來寫,可是寫不出來。
有沒有高手可以示範?
我寫過排列,讀資料結構時,照著課本演算法寫的,有用到遞迴

http://s.bcse.info/download/fast-permutation.phps

演算法跟 Wikipedia 上的應該是同一個

http://en.wikipedia.org/wiki/Permutation#Algorithm_to_generate_permutations

不過我覺得這種程式還是不要用 PHP 寫比較有效率



組合我就沒寫過了

--
 藍白色的太陽閃爍著殘曄 / 被黑烏鴉的陰霾消蝕殆盡
 銳利的新月散發出綠光 / 與神聖的六芒星相互輝映
 血色的蒼穹彷彿是在舉行祭禮 / 吟唱著沒有靈魂的可蘭經
 絳紅旋轉成為黑色漩渦 / 弔唁伯利恆的深邃森林

(C)BethlehemCrescentShiiteEclpise http://blog.bcse.info/ 
--
夫兵者不祥之器物或惡之故有道者不處君子居則貴左用兵則貴右兵者不祥之器非君子
之器不得已而用之恬淡為上勝而不美而美之者是樂殺人夫樂殺人者則不可得志於天下
矣吉事尚左凶事尚右偏將軍居左上將軍居右言以喪禮處之殺人之眾以哀悲泣之戰勝以
喪禮處之道常無名樸雖小天下莫能臣侯王若能守之萬物將自賓天地相合以降甘露民莫
之令而自均始制有名名亦既有夫亦將知止知止可以不134-208-33-185.ndhu.edu.tw海
只能靜靜看著了 ...
2007-09-14 14:53:58 UTC
Permalink
※ 引述《bcse (Lvx ex Caelis)》之銘言:
Post by Lvx ex Caelis
我寫過排列,讀資料結構時,照著課本演算法寫的,有用到遞迴
http://s.bcse.info/download/fast-permutation.phps
permutate() 是將 given array 的元素作各種排列,最後回傳一個結果 array
print_permutate() 的演算法跟上面一樣,但它是直接 echo 出來
permutate_all() 跟 permutate() 的不同之處是它會排出重複元素的結果
Ex: given array 是 array("A", "B", "C") 的話
permutate_all() 會排出 AAA、AAB 這樣的結果(其中重複使用了A)
不過 permutate() 不會去判斷 given array 中的元素是否重複…
所以如果 given array 是 array("A", "A", "A") 的話……
permutate() 就會排出 AAA 了 XD
演算法跟 Wikipedia 上的應該是同一個
http://en.wikipedia.org/wiki/Permutation#Algorithm_to_generate_permutations
不過我覺得這種程式還是不要用 PHP 寫比較有效率
組合我就沒寫過了
感謝,不過我的問題的數學不是這個意思,我想問的是:譬如有6個元素,任意取 4 個
(已取過的不能再取)把可能的取法都列出來 (就是排列組合的 C(n,m)的意思):
下面是我寫的,n 是從 1 到 49 中任意選 n 個,但是固定取 4 個 C(n,4) 的寫法,
用到四層迴圈,我用的邏輯就是要取幾個就要有幾層迴圈,但是這樣就沒辦法動態,
本來想做取幾個也可以指定,但是用遞迴還沒搞出來 ... 今天有想到一些
之前的瓶頸在哪邊,這兩天如果有試出來再 PO 上來分享 :p
感覺用遞迴做任意 m 效率應該比直接寫死迴圈差很多,不過就是想磨練一下
遞迴跟陣列 :)

謎之音:為什麼是從 1 到 49 中選呢? XD

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>

<head>
<meta name="GENERATOR" content="Quanta Plus">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>C n 取 m</title>
</head>
<body>
<?
if(!empty($_POST)){
if(!(count($_POST['choosed']) < $_POST['want'])) {
$n = count($_POST['choosed']);
$m = (int) $_POST['want'];
echo "C $n 取 4: ";
for($i=0; $i<$n; $i++){
echo $_POST['choosed'][$i]." ";
}
echo "<br>";
$cnt = 0;
for($i = 0; $i< $n - 3; $i++){
for($j = $i+1; $j< $n - 2; $j++){
for($k = $j+1; $k < $n - 1; $k++){
for($l = $k+1; $l < $n; $l++){
echo "<span style='white-space:nowrap;'>(";
echo "{$_POST['choosed'][$i]},
{$_POST['choosed'][$j]}, {$_POST['choosed'][$k]}, {$_POST['choosed'][$l]}";
echo ")</span> ";
$cnt++;
}
}
}
}
echo "共".$cnt." 筆";
}
}
?>

<form action="cnm.php" method="POST">
<?
for($i = 1; $i < 50; $i ++){
echo "<span style=\"white-space:nowrap;\"><input name=\"choosed[]\"
type=\"checkbox\" value=\"{$i}\" id=\"{$i}\"><label
for=\"{$i}\">{$i}</label></span> ";
}
?>
<p>
<input type="text" name="want" value="1">
<input type="submit" value="送出">
</form>

</body>
</html>
--
夫兵者不祥之器物或惡之故有道者不處君子居則貴左用兵則貴右兵者不祥之器非君子
之器不得已而用之恬淡為上勝而不美而美之者是樂殺人夫樂殺人者則不可得志於天下
矣吉事尚左凶事尚右偏將軍居左上將軍居右言以喪禮處之殺人之眾以哀悲泣之戰勝以
喪禮處之道常無名樸雖小天下莫能臣侯王若能守之萬物將自賓天地相合以降甘露民莫
之令而自均始制有名名亦既有夫亦將知止知 219-81-195-131.dynamic.tfn.net.tw海
銀色
2007-09-18 06:40:29 UTC
Permalink
[恕刪]

function C ($m, $n, $s='') {
if ($n == 1) {
$l = count ($m);

for ($i=0; $i<$l; $i++) {
echo $s . $m[$i] .'<br />';
}
} else {
$l = count ($m) - ($n - 1);

for ($i=0; $i<$l; $i++) {
$t = '';
$t = $s.$m[$i];

$q = $m;

for ($j=0; $j<=$i; $j++) {
array_shift ($q);
}

C ($q, $n-1, $t);
}
}
}


$m = array ('A', 'B', 'C', 'D');
$n = 2;

C ($m, $n);

--
夫兵者不祥之器物或惡之故有道者不處君子居則貴左用兵則貴右兵者不祥之器非君子
之器不得已而用之恬淡為上勝而不美而美之者是樂殺人夫樂殺人者則不可得志於天下
矣吉事尚左凶事尚右偏將軍居左上將軍居右言以喪禮處之殺人之眾以哀悲泣之戰勝以
喪禮處之道常無名樸雖小天下莫能臣侯王若能守之萬物將自賓天地相合以降甘露民莫
之令而自均始制有名名亦既有夫亦將知止知止可以不殆譬道之在天 61.57.130.248海
Loading...