※ 引述《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>
--
[1;30;40m夫兵者不祥之器物或惡之故有道者不處君子居則貴左用兵則貴右兵者不祥之器非君子[m
[1;30m之器不得已[37m[30m而用之恬淡為上勝而不美而美之者是樂殺人夫樂殺人者則不可得志於天下
[m[1;30m矣吉事尚左凶事尚右偏將軍居左上將軍居右言以喪禮處之殺人之眾以哀悲泣之戰勝以[m
[1;30m喪禮處之道常[37m無名[30m樸雖小天下莫能臣侯王若能守之萬物將自賓天地相合以降甘露民莫[m
[1;30m之令而自均始制有名名亦既有夫亦將知止知 [37m219-81-195-131.dynamic.tfn.net.tw[30m海[m