• 締切済み

数学の「組み合わせ」を求めるプログラム

お世話になっています。 早速ですが、数学の「組み合わせ」を求めるプログラムを作成中です。 例えば、1~6の数字の中から4個取り出す場合、パターンとしては、 (1,2,3,4) (1,2,3,5) (1,2,3,6) (1,2,4,5) (1,2,4,6) (1,2,5,6) (1,3,4,5) (1,3,4,6) (1,3,5,6) (1,4,5,6) (2,3,4,5) (2,3,4,6) (2,3,5,6) (2,4,5,6) (3,4,5,6) の15パターンが挙げられます。 「1~aの数字の中からb個取り出す」場合、上記の例だとa=6、b=4ですが、 このようにa,bにそれぞれ値を与えると、上記のようにすべての組み合わせを 求めてくれるPHPプログラムを作成中です。 実現方法、ソースコードなど、ご教授いただけないでしょうか。 よろしくお願い申し上げます。

  • PHP
  • 回答数4
  • ありがとう数6

みんなの回答

  • yuu_x
  • ベストアンサー率52% (106/202)
回答No.4

あーいかん。早速やらかしてる。 $m - $p >= $n ⇒ $m - $p >= $n - 1 ちなみにどちらもマイナスでも問題ない。

  • yuu_x
  • ベストアンサー率52% (106/202)
回答No.3

function combination_list($p, $m, $n, $c=array()) { static $r = array(); if ($n < 1) { $r[] = $c; } elseif ($m - $p >= $n) { combination_list($p+1, $m, $n-1, array_merge($c, (array)$p)); combination_list($p+1, $m, $n, $c); } return $r; } var_dump(combination_list(1, 6, 4)); >2 は、引数判定が甘いのと、$c の初期化忘れてるからよろしく。

  • yuu_x
  • ベストアンサー率52% (106/202)
回答No.2

function combination_list($p, $max, $n) { if ($n > $max) return false; $r = array(); $i = 0; while ($i >= 0) { $m = $max; while ($i < $n) { $c[$i++] = $p++; } while ($c[--$i] == $m--); $p = $c[$i] + 1; $r[] = $c; } return $r; } var_dump(combination_list(1, 6, 4)); ループを一個にまとめれそうだけど、途中で飽きた。 再帰の例がここに載ってるけど、PHP に移植する場合は一手間いる。 http://okwave.jp/qa/q4594769.html

回答No.1

http://ideone.com/NQDX1 多分もっと簡単な方法あるだろうなあ…

関連するQ&A

  • 数学 組み合わせ?の問題 1,1,2,3,3

    数学 組み合わせ?の問題 1,1,2,3,3 上記の5つの数字を並び替えたいのですが、 何パターンあるでしょうか? 答えは30通りだと思うのですが、 地道に樹形図をつくってやってみました。 しかし、例えば、1,2,3,を並び替える場合、・・・(1) 3*2*1=6通り といったように、簡単に計算できます。 あるいは、例えば、1,1,1,2,2を並び替えるなら、・・・(2) 5P2=(5*4)/(2*1)=10通り といったように同じく容易に計算できます このように簡単に計算したいのですが・・・ よろしくお願いします。

  • Excelで、数字の組み合わせの合計が一定数になるパターンの抽出

    Excelで、数字の組み合わせの合計が一定数になるパターンの抽出 たとえば、つぎの配列があるとします。 A(5){10,20,30,40,50}要素数が5つ1..5、{}は内容 このなかで二つ以上の組み合わせで和が60になる組み合わせを出したいとします 答えは パタン1:1,2,3  /* 10+20+30 */ パタン2:1,5 /* 10+50 */ パタン3:2,4 /* 20+40 */ 同じような処理をExcelの関数では実現できますでしょうか? また上記のような組み合わせのパタンの総数を求める公式はありますか? 初歩的な高等数学で恐縮です。

  • VBの組み合わせプログラムについて。

    初めまして。複数部品からなる製品の組立途中の形状パターンを抽出する プログラムを作成しているのですが、良いループが組めず困っています。 例えばA,B,C,Dと4つの文字からなる以下のような組み合わせ作成するループ文を作成したいです。 条件 ・入力文字数は可変します。A,B,C,D→A,B,C,D,E ・組み合わせ内で同じ文字は2度使用されません。 ・A,B,CとB,C,Aは同一とします。 1文字のパターン A B C D 2文字のパターン A,B A,C A,D B,C B,D C,D 3文字のパターン A,B,C A,C,D B,C,D 4文字のパターン A,B,C,D 4文字からなるパターンは全部で14パターンになります。 以上、宜しくお願い致します。

  • 組み合わせ

    1~10の数字の組み合わせで  ・2個ずつ、5組を1パターンとして9パターン作る  ・1パターンの中に1~10すべての数字を使う(同じ数字を使わない)  ・9パターンの中に同じ組み合わせのものがないようにする  ・例えば1-6と6-1は同じ組み合わせと考える 組み合わせとして45通りできるのはわかるのですが、 そこから9パターンが作れなくて。 (家族で頑張ったのですが7パターンまで・・・・) 文章にするとわかりにくいと思いますがよろしくお願いします。

  • 数字の組み合わせの問題。求め方を忘れてしまいました。。。

    こんばんは。よろしくお願いします。 数学のことをすっかり忘れてしまった者です(汗 確かこんな場合の計算方法あった。。。よな~??と思いながら、教科書を引っ張り出すわけにもいかず(引っ張り出す物が既に無い)、悩んでいます。 どなたか計算方法を教えてください。よろしくお願いします。 1、2、4、8、16、32 の6つの数字があります。 「16」が含まれる場合の数字の組み合わせの値はそれぞれいくつか? 単純にパターンだけ考えると 6×5×4×3×2×1で、720通りだったかな。。? と思うのですが 16が含まれるパターン。。。 16 16+1 16+1+2 16+1+2+4 16+1+2+4+8 16+1+2+4+32 16+1+4 16+1+4+8+32 16+1+4+32 16+4+32 。。。。なんか、全パターン書いていると頭がマズイ事になりそうなので。。。 何か計算方法ってありませんでしたっけ??(汗

  • 全組合せの洗い出しプログラム作成に悩んでいます(ExcelVBA/AccessVBA)

    0-5までの数字を使用して 3~10個の数字の組合せを作成したいと思っています。 組合せを書きだしてみたり、 数学やプログラムのページをネットで探してみたのですが 理解力不足でロジックが思いつきませんでした…。 桁数、使用数字の最大値を指定して、 最終的に配列等に持たせる事が目標です…。 3桁,使用数字の最大値2(0-2)の場合 {0,0,0} {0,0,1} {0,1,1} {0,1,2} {1,1,1} {0,0,2} {0,2,2} {2,2,2} といった具合です。(漏れていたらすいません…) ヒントだけでもいただけたらとても助かります。 宜しくお願いいたします。

  • エクセルで組みあわせについて教えて下さい。

    エクセル2000です。エクセルで組合せの合計をだしたいのですが、 A1 58 B1 13.5 C1 44.5 D1 51.5 E1 31 F1 49.4 G1 19.6 H1 41.5 J1 41 となっていて、その中から「292」に一番近い組合せを知りたいんですが、方法がありましたら教えて下さい。 上記の場合だったら 58、51.5、31、49.4、19.6、41.5、41 が292になるといった感じです。 292になるなら上記では7つ数字を使いましたが、5つでも6つでもいいです。ぴったりにならなくても近似値でもOKです。 宜しくお願いします。

  • 上限のある重複組合わせ(?)

    以下の42個の数字から、n個 抜き取った組合わせは何通りかという問題がありまして(自作)。 1, 5, 6, 6, 8, 8,10,13,13,14, 14,15,17,18,18,19,21,21,22,25, 26,27,28,28,30,30,30,30,30,31, 31,34,35,35,36,39,40,40,41,41, 41,42 総当りで出力し、カウントをするプログラムはできまして(n=0個から) 1 26 337 2902 18667 95612 405931 1468386 4616880 12809820 31736232 70875642 143789049 ・・・ という感じで答えはわかっているのですが、時間もかかるし(3sぐらい)実際の組合わせは知る必要はないので もっと数学的に計算でできないのか、考えているんですけど解りません。 問題を簡単にして、↓のように考えたのですが、やっぱり無駄に計算量が多いような気がします。 1,1,1,1,2,2,2,3,3,4 の10個の内 7個 4種類の数字の重複組合わせをベースとし 4 H 7 -> 4+7-1 C 7 -> 10 C 7 -> 120 ・4 は、1つしかないので、2つ以上を含むパターンを除外する 4-4 確定 あと 5つを 4 H 5 -> 56 ・3 は、2つしかないので、3つ以上含むパターンを除外する。 3-3-3 確定 あと4つを 4 H 4 -> 35 ・2 は、 3つしかないので、4つ以上含むパターンを除外する。 2-2-2-2 確定 あと3つを 4 H 3 -> 20 ・1 は、 4つしかないので、5つ以上含むパターンを除外する。 1-1-1-1-1 確定 あと2つを 4 H 2 -> 10 120-56-35-20-10 = -1 ただし、以下は重複しているので加算する。 4-4-3-3-3-*-* 10 4-4-2-2-2-2-* 4 3-3-3-2-2-2-2 1 4-4-1-1-1-1-1 1 -1 +10+4+1+1 -> 15 プログラムはすこしわかるのですが、数学はわかりません。 すぱっと数式ででるやりかたがあれば教えてください。

  • エクセルで256通りの組み合わせ

    たとえば、A,B,C,Dという箱にそれぞれ1~4の数字を入れると 1111 1112 1113 ・ ・ ・ 4444 と全部で256通りの組み合わせができると思います。 このようにいくつもの値の組み合わせをエクセルで全て作製するにはどのようにしたらよいのでしょうか。 実際には、Aに(10,20,30,40)、Bに(0.5,1.0,1.5,2.0)、Cに(500,600,700,800)、Dに(1.1,1.2,1.3,1.4)という感じの値の組み合わせを全通り作りたいです。 簡単なことかもしれませんが、あまり詳しくないので困っています。 よろしくお願いいたします。

  • PHPによる並べ替え(ソーティング)のプログラム方法

    例えば次のような表があったとします。 ------------------- |名前|国語|数学|英語| ------------------- | B | 75 | 82 | 69 | ------------------- | C | 87 | 80 | 71 | ------------------- | A | 85 | 73 | 92 | ------------------- これを例えば国語の点数の高い順で並べ替えるとこうなりますよね。 ------------------- |名前|国語|数学|理科| ------------------- | C | 87 | 80 | 71 | ------------------- | A | 85 | 73 | 92 | ------------------- | B | 75 | 82 | 69 | ------------------- さてここで質問なのですが、上のような数字や名前のアルファベット順でのソーティングを実現するプログラムは、どのように作成すればよいのでしょうか。 済みませんがどなたかお教え下さい。勿論教えるときに例として上の表を用いてもかまいません。

    • 締切済み
    • PHP

専門家に質問してみよう