総当りの配列を返す関数の作成が上手くいきません。
関数にしてほしいことは、与えられた配列arrからnum個取り出す組み合わせを配列で返してもらうことです。
下記が例です。関数の名前をtotalHitとします。
********************************************
var arr = [0,1,2,3,4];
var num = 2;
var arr2 = totalHit(arr,num);
/*
arr2に[[0,1],[0,2],[0,3],[0,4],[1,2],[1,3],[1,4],[2,3],[2,4],[3,4]]が
代入されてほしい
*/
********************************************
ネットでもずいぶん探しましたが、目的のものは見つかりませんでした。
アルゴリズムが分かる方、ヒントでもかまいませんので、ご教示願います。
No.2ベストアンサー
- 回答日時:
樹形図を書き出してみると分かりやすいかと思いますが、きれいなツリー構造をしているので、再起関数でできると思いますよ。
例えば、[0, 1, 2, 3] から 3 つを選ぶ場合の、樹形図は(掲示板の関係少し見ずらいかもしれません)
0-1-2
|*|-3
|-2-3
1-2-3
というツリーが出来上がります。ツリー構造の場合、隣と下を順にたどっていけば、全ての枝を通ることができます。
例えば、最初の 0 の位置の場合、隣の 1 と 下の 1 を発火させます。
隣の 1 はさらに隣の 2 と下の 2 を発火。後は適度に終了判定を入れるだけです。
function totalHit(ary, num){
var r = [];
(function(m, n, p, c){
if(n < 1){
r.push(c);
}else if(m - p >= n){
arguments.callee(m, n - 1, p + 1, c.concat(ary[p])); // 下のノード
arguments.callee(m, n, p + 1, c); // 隣のノード
}
})(ary.length, num, 0, []);
return r;
}
引数の p は現在位置、m は配列数、n は取り出す個数(ツリーの下へ行くほど、取り出す個数は減っていきます)
先の例の場合、最初の n は 3、ひとつ下の n は 2 という具合です。
最後の c は組み合わせごとの部分配列です。
もう少し実行速度を上げれると思いますので、色々工夫してみてください。
樹形図が良く分からなかったのですが、多分
0-1-2
| └-3
└-2-3
1-2-3
ということですよね?
関数を実行したことろ、上手くいきました。
arguments.calleeなど、知らない関数(?)もあるので、これを期に、
もっと知識を増やして以降と思います。
ありがとうございました。
No.1
- 回答日時:
あなた自身、[[0,1],[0,2],[0,3],...] という答えを得る作業をすでにされていますね、頭の中で。
まず先頭の 0 を軸にして他と組み合わせる。
次に 1 を軸にして自分より右にあるものと組合せる。
後も同様に、自分より右にあるものと組合せる。
これを JavaScript で書けば、すでに出来てるじゃないですか。
「自分より右にあるものと組合せる。」は、実は先頭の 1 や 2 にも適用可能で、その時ルールは「自分より右にあるものと組合せる。」以外何も要らない事に気付けば、スマートなコードになります。
それは分かるのですが…
function totalHit(arr,num){
var returnArr = [];
for(i=0;i<arr.length;i++){
for(j=i+1;j<arr.length;j++){
...
}
}
return returnArr;
}
numの値によって、for文の個数が変化してしまうと思うのです。
どうすればいいのでしょうか??
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- JavaScript EasyUIのSubGrid(jquery)におけるObjectに入れた連想配列について 1 2022/05/02 11:21
- Excel(エクセル) excel vbaの配列なんですが・・・ 1 2022/12/26 18:50
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- JavaScript 配列の1要素を代入した変数を使って元の配列要素を削除できるか 1 2023/07/28 03:34
- JavaScript ソースコードのいじる場所が分かりません。 1 2022/12/23 02:06
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C#テキストボックスの文字を配...
-
javascript 変数名の連結をしたい
-
同じIDで定義した要素の配列を...
-
JSONデータを50音順でソートしたい
-
助けてください‼︎ javascriptで...
-
textareaに入力されたデータを...
-
jspからjavascriptの変数引継ぎ
-
React hooksが値を返して配列変...
-
配列を作って総当たりで距離を...
-
javascriptで2つのArrayの...
-
JavaScript で配列の終わりまで...
-
JavaScriptにおける[] とか :...
-
Javascriptで文字を順番に表示...
-
JavaScriptでの動的な多次元配...
-
javascriptからphpに配列データ...
-
文字を一文字ずつ表示
-
window.openでタイトル名の指定
-
関数でy=g(x)のgとは何の略です...
-
C#OpenCv V4にのエラーに関する...
-
Excel VBA の ChangeFileAccess
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
同じIDで定義した要素の配列を...
-
C#テキストボックスの文字を配...
-
jspからjavascriptの変数引継ぎ
-
javascript 変数名の連結をしたい
-
二次元配列を使って順位をだす...
-
javascriptで行を抽出したいです。
-
多次元配列から最大値を1行また...
-
javascriptからphpに配列データ...
-
Perlの配列をJavaScriptに渡せ...
-
JSONデータを50音順でソートしたい
-
どうすればresponseText結果を...
-
バナーのランダム表示(複数、...
-
JavaScriptでの動的な多次元配...
-
JavaScriptからPHPに配列を渡す...
-
javascript 省略した記述と思わ...
-
【Google Apps Script】コード...
-
[JS] setAttributeで保存される...
-
javascriptで2つのArrayの...
-
javascriptを用いて作成された...
-
JavaScriptの配列変数検索
おすすめ情報