現在有一個數組如下:
$a = [1,2,3,4,5,6,7,8,9]
現在要通過上面的資料元素重建長度為2,3,4...的新數組,並且統計一共組成了新數組的個數.
比如產生長度為2的數字,並且統計$b個數 例:
$b = [1,2]$b = [1,3]$b = [1,4]$b = [1,5]
現在使用的一個比較笨的方法就是使用迴圈.長度為2就使用2個迴圈,3個就用3個迴圈.這樣代碼不利於維護.如果有10個,那麼要10個迴圈.
回複內容:
現在有一個數組如下:
$a = [1,2,3,4,5,6,7,8,9]
現在要通過上面的資料元素重建長度為2,3,4...的新數組,並且統計一共組成了新數組的個數.
比如產生長度為2的數字,並且統計$b個數 例:
$b = [1,2]$b = [1,3]$b = [1,4]$b = [1,5]
現在使用的一個比較笨的方法就是使用迴圈.長度為2就使用2個迴圈,3個就用3個迴圈.這樣代碼不利於維護.如果有10個,那麼要10個迴圈.
$a = [1,2,3,4,5,6,7,8,9];// 需要分區的大小$perSize = 2;$leader = array_shift($a);$bs = array_chunk($a, $perSize - 1);$bs = array_map(function ($item) use ($leader) { array_unshift($item, $leader); return $item;}, $bs);// 所有的 $b, 和 $b 的個數var_dump($bs, count($bs));
http://blog.sina.cn/dpool/blog/s/blog_4dfb08c901011wut.html?vt=4
#include int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};int array2[9];int array2len = 0;void perm(int len, int index){ int i, j; if (array2len < len) { for (i = index; i < 9; i++) { array2[array2len] = array[i]; array2len++; perm(len, i + 1); array2len--; } } else { for (j = 0; j < array2len; j++) printf("%d", array2[j]); printf("\n"); }}int main(int argc, char **argv){ int i; for (i = 2; i < 10; i++) { array2len = 0; perm(i, 0); }}
我的思路是用遞迴,代碼如上,C語言的。
對了,要統計的話,有兩個思路:一個是在上面的代碼中加一些邏輯,在每次需要輸出array2的時候統計;另一個是用組合數的計算公式直接計算,比如題中9個數字產生的所有組合共有502個,高中數學講過。