割り切れなくなるまで分割して配列に入れたい

このQ&Aのポイント
  • 配列を分割していき、最終的に割り切れなくなるまで分割した配列を作成したいです。
  • 配列を再帰的に分割し、割り切れなくなるまで繰り返します。
  • 配列の要素を半分に分割し、割り切れない場合は1つだけ多い要素を作成します。
回答を見る
  • ベストアンサー

割り切れなくなるまで分割して配列に入れたい

<?php make(7); function make($n) { $arr = array($n); $arr_new = division_arr($arr); print_r($arr_new); } function division_arr($arr) { for ($i = 0; $i < count($arr); $i++) { $arr_new[$i] = division($arr[$i]); if ($arr_new[$i][0] > 0) { return division_arr($arr_new[$i]); } else { } } return $arr_new; } function division($n) { $a = $b = floor($n / 2); if ($n % 2 != 0) { $b+=1; } return array($a, $b); } /* array( [3,4], [[1,2],[2,2]], [[0,1],[1,1],[1,1],[1,1]] ); 再帰的に配列を分割していき、最終的にこのような出力にしたいです。 */ ?> 教えて下さい。よろしくお願いいたします。m(_ _)m

  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

配列の構造も最終形もおかしくないですか? まず構造が [3,4], [[1,2],[2,2]], [[0,1],[1,1],[1,1],[1,1]] としていますが [3,4], [[1,2],[2,2]], [[[0,1],[1,1]],[[1,1],[1,1]]] じゃないの?そうじゃなければこう [[3,4]], [[1,2],[2,2]], [[0,1],[1,1],[1,1],[1,1]] また、最終型は [1,2]が[0,1],[1,1]なら[1,1]も[0,1],[0,1]までいかないと ロジック的におかしくないですか? いずれにしろ仕様がかたまってないので回答しようがないかと

bavarois
質問者

お礼

ご指摘のとおり、構造が間違っておりました。 考えなおしてきます。 ありがとうございました!

関連するQ&A

  • 配列の次元を超えてランダムに選択したい

    PHP5.2.4を使用しています。 例えば、次のような2次元以上の配列があったときに $arr[0][0] = array('a' => 1, 'b' => 11); $arr[0][1] = array('a' => 2, 'b' => 5); $arr[0][2] = array('a' => 3, 'b' => 20); $arr[1][0] = array('a' => 4, 'b' => 3); $arr[1][1] = array('a' => 5, 'b' => 30); この5つから、'b'の値が10以上の候補だけのインデックス($arr【[1][1]】←この部分)を ランダムに1つ選ぶ方法はどのようになるのでしょうか? 自分が考えたのは for ($i = 0; $i < count($arr); $i++) {  for ($j = 0; $j < count($arr[$i]); $j++)  {   if ($arr[$i][$j]['b'] < 10)    continue;   $new_arr[] = array('index2' => $i, 'index1' => $j);  } } $key = array_rand($new_arr, 1); print_r($new_arr[$key]); //Array ( [index2] => 0 [index1] => 0 ) //Array ( [index2] => 0 [index1] => 2 ) //Array ( [index2] => 1 [index1] => 1 ) //いずれかが選択される なんですが、これだとあまり良いやり方だと思わなくて なにか別のやり方はあるのでしょうか?

    • 締切済み
    • PHP
  • 多次元配列を、1次元の配列にする関数を書いてください。

    以下のように、多次元配列の配列をペチャンコにする関数(array_flatten)ってどうかきますか? <?php $arr[0] = 'a'; $arr[1][0] = 'b'; $arr[1][1][0] = 'c'; $arr[1][1][1][0] = 'd'; $arr[1][1][1][1][0] = 'e'; $arr[1][1][1][2] = 'f'; $arr[1][1][2] = 'g'; $arr[1][2] = 'h'; $arr[2] = 'i'; function array_flatten($arg){   処理; } $new_arr = array_flatten($arr); print_r($new_arr); ?> ↓ Array (   [0] => a   [1] => b   [2] => c   [3] => d   [4] => e   [5] => f   [6] => g   [7] => h   [8] => i ) ※関数のなかで、ペチャンコの配列を格納するための新しい配列を宣言すると、 同関数を再帰的に呼び出したら、その配列が初期化されますよね?

    • ベストアンサー
    • PHP
  • 関数内での繰り返し処理の結果を配列で受け取りたい

    関数内でfor文で繰り返し処理を行い、 結果を配列として返すような関数を書きたいと思っています。 function hoge(){ var a = [1,2,3,4]; for (var i=0; i < a.length; i++){ a1 = "a" + i; var arr = new Array(); arr.push(a1); } return arr; } しかし、以下のように 関数hogeの結果を変数bで受け取ってみると、 配列の最後のデータしか表示されません。 var b = hoge(); alert(b); //a3のみが表示される a0, a1, a2, a3と表示されるようにするには、 どうしたらよいでしょうか。

  • しりとり 無限ループ?

    【予約語から最長のしりとりを作ろう!】 https://codeiq.jp/ace/stakemura/q408 この問題やってるんですが 処理がtimeoutしちゃいます 最長の結果が10個程度の時は期待通りに動作します 期待される結果が20程度になると(?)timeoutします 単にウチのマシンじゃムリなのか、工夫が足りないのか 無限ループを起こしてるのか、重いだけなのか判断つきません よろしくお願いします (cpp11_keywords.csvはC++の予約語84個のcsvです) <?php $data=explode(chr(10),file_get_contents('cpp11_keywords.csv')); foreach($data as $i=>$cpp){$data[$i]=trim($data[$i]);} echo(implode('<br/>',createSiritori($data))); function createSiritori($words){ $rtn=array(); $data=array(); for($i=0,$len=count($words);$i<$len;$i++){ $data[$i]=array(); for($j=0;$j<$len;$j++){ if($i==$j)continue; if(is_connectable($words[$i],$words[$j]))$data[$i][]=$j; } } $rcd=0; for($i=0;$i<$len;$i++){ $crr=array($i); for($j_arr=array(0),$j_ind=0,$len_arr=array(count($data[$i]));$j_arr[0]<$len_arr[0];$j_arr[$j_ind]++){ if($j_arr[$j_ind]>=$len_arr[$j_ind]){ array_pop($crr); array_pop($j_arr); array_pop($len_arr); $j_ind--; }else if(!in_array($data[end($crr)][$j_arr[$j_ind]],$crr)){ $crr[]=$data[end($crr)][$j_arr[$j_ind]]; $j_ind++; $j_arr[$j_ind]=0; $len_arr[$j_ind]=count($data[end($crr)]); if($j_ind>$rcd){$rcd=$j_ind;$rtn=$crr;} } } } for($i=0,$len=count($rtn);$i<$len;$i++){ $rtn[$i]=$words[$rtn[$i]]; } return $rtn; } function is_connectable($a,$b){ return (substr($a,-1)==substr($b,0,1)); }

    • ベストアンサー
    • PHP
  • 2つの配列を再帰的に上書きでマージしたい

    array_merge_recursive では配列が同じ数値キーを有している場合、 後の値は元の値を上書せず、追加されます。 これを上書されるようにしたいのですが、どのようにすれば良いでしょうか? $arr3 = mymerge($arr1,$arr2); のような形で$arr3が得られると助かります。 $arr1,$arr2は再利用したいので書き換えられないようにしたいです。 次のような物をネット上で見つけたのですが、これでは$arr1が書き換えられてしまいます。 function mymerge(&$arr1,$arr2){ foreach ($arr2 as $key=>$value){ if(is_array($value)){ mymerge(&$arr1[$key],$value); }else{ $arr1[$key]=$value; } } return $arr1; } 次のようにすれば良いのかもしれませんが、1つのfunctionでできると助かります。 $temp1 = array(); $temp2 = mymerge($temp1,$arr1); $arr3 = mymerge($temp2,$arr2); いくら考えても分からないので、すみませんがどなたか教えてください。_○_

    • ベストアンサー
    • PHP
  • 配列中のあるキー、値を取得して、それを変更したい

    やりたいことは、 $hoge = array ( 0 => '1', 1 => '2', 2 => '3', 3 => '3', 4 => '3' ); のような配列があったとします。 この配列の値の出現頻度を調べて、 $hoge_syutugen_hindo = array_count_values($hoge); print_r($hoge_syutugen_hindo); $hoge_syutugen_hindoの結果 Array ( [1] => 1 [2] => 1 [3] => 3 ) $hoge_syutugen_hindoの結果で[3]の出現頻度が3回以上あったら、 Array ( [1] => 1 [2] => 1 [3] => 3 ) を Array ( [1] => 1 [2] => 1 [4] => 1 ) に変更。 少ない場合は Array ( [1] => 1 [2] => 1 [3] => 2 ) を Array ( [1] => 1 [2] => 1 [3] => 2 ) そのままの配列を返したいのです。 $hogeの配列の値には必ずしも1や2が含まれるわけではありません。 $hoge = array ( 0 => '3', 1 => '3', 2 => '3' ); や$hoge = array ( 0 => '1', 1 => '3', 2 => '3', 3 => '3' ); のようなパターン等もあります。 わたしなりに下記のようなスクリプトを作成しましたが、 $arr_pattern = '/^(3\s=>\s)[3-99]$|^(3=>)[3-99]$|^(3=>\s)[3-99]$|^(3\s=>)[3-99]$|^(3\s=>\s)\'[3-99]\'$|^(3=>)\'[3-99]\'$|^(3=>\s)\'[3-99]\'$|^(3\s=>)\'[3-99]\'$|^(\[3\]\s=>\s)[3-99]$|^(\[3\]=>)[3-99]$|^(\[3\]=>\s)[3-99]$|^(\[3\]\s=>)[3-99]$|^(\[3\]\s=>\s)\'[3-99]\'$|^(\[3\]=>)\'[3-99]\'$|^(\[3\]=>\s)\'[3-99]\'$|^(\[3\]\s=>)\'[3-99]\'$/'; reset($deliyery_kind_syutu); while(list($k, $v) = each($deliyery_kind_syutu)) { $kv = "$k=>$v"; if(preg_match($arr_pattern, $kv)){ $new_hkv = preg_replace($arr_pattern,'4 => 1', $kv); $n = count($deliyery_kind_syutu); for($i=0; $i<$n; $i++){ $new_array[] = ($deliyery_kind_syutu[$i]); } $new_array[] = $new_hkv; } } array ( 0 => NULL, 1 => 1, 2 => 1, 3 => '4 => 1', )となり、array(1 => 1, 2 => 1, 4 => 1)のような結果になりませんでした。 分かる方が見えましたらご教授ください。

    • ベストアンサー
    • PHP
  • 配列をソートしたいです

    配列をソートしたいです ArrayクラスのsortOn()を使って、 「x座標の大きい順」に順番をならべ変えたいのですが 上手く行きません。。 現在、配列を使い 3つの矩形のSpriteを配置しています。 ↓現在のコード ===================================== var arr:Array = new Array(); for(var i:int=0; i<3; i++){  arr[i] = new Sprite();  with(arr[i].graphics){   beginFill(0x666666);   drawRect(0,0,8,8);   endFill();  }  arr[i].x = i*10;  addChild(arr[i]); } ===================================== 今、各Spriteのxプロパティは  arr[0].x = 0;  arr[1].x = 10;  arr[2].x = 20; になっているのですが、 これをソートして  arr[0].x = 20;  arr[1].x = 10;  arr[2].x = 0; にならべ変えたいのですが、 どのように書けばいいのかがわかりません。。 今、このように書いてるのですが arr.sortOn(arr.x, Array.NUMERIC); 並べ替えができません、 (おそらく arr.x が駄目なのだと思うのですが。。) どなたかご存知の方いらっしゃいましたら どうかよろしくお願いいたします。

    • ベストアンサー
    • Flash
  • 3つの連想配列を交互に代入して、新しい連想配列を作りたい

    PHP Version 5.1.6を使っています。 それぞれの連想配列を先頭から順番に交互に代入したいのですが、 どのようなプログラムでできるのでしょうか? $arr1 = array(a1=>"aa1", a2=>"aa2", a3=>"aa3"); $arr2 = array(b1=>"bb1", b2=>"bb2", b3=>"bb3"); $arr3 = array(c1=>"cc1", c2=>"cc2", c3=>"cc3"); 代入後 $new_arr = array(  a1=>"aa1",  b1=>"bb1",  c1=>"cc1",  a2=>"aa2",  b2=>"bb2",  c2=>"cc2",  a3=>"aa3",  b3=>"bb3",  c3=>"cc3", );

    • ベストアンサー
    • PHP
  • JavaScriptでオブジェクトの配列

    function myfunc() {} で定義したようなオブジェクトを var arr = new Array(); arr.push()で配列に入れて、あとから取り出す際に arr[0]をmyfunc型として使うにはどうすればよいでしょうか? キャストのようなものも多分なさそうですし。

  • 総当たりのアルゴリズムについて

    このジャンルでお願いします。 例えば、「aba」という文字列なら、 a b ab aa aba という要素(順不同です)を得たいと思い、自分なりに作ってみたのですが、 やはり調べる文字数が9文字辺りから処理に時間がかかり重くなってしまいます・・・ もちろんこういうアルゴリズムではそうなることはしょうがないと思いますが、 もう少し効率の良いやり方があればアドバイスをい頂けないでしょうか? 下に自分作った例です(メソッド名とか滅茶苦茶ですが・・^^;)) //文字の総当たりを得る //aba なら a,b,ab,aa,aba class AllCombinationCharacter { private $_characters = array(); public function __construct($text) { $this->_characters = self::split($text); } public static function split($text) { $cnt = 0; $arr = array(); while ($chara = substr($text, $cnt++, 1)) { $arr[] = $chara; } return $arr; } private function setList(&$list, $addText) { if (is_array($list)) { $find = false; foreach ($list as $item) { if (self::isMatchInRandomOrder($item, $addText)) { $find = true; break; } } if (!$find) { $list[] = $addText; } } } private function recursive($list, $addText, $startIndex) { for ($i = $startIndex; $i < count($this->_characters); $i++) { $text = ""; $text .= $addText . $this->_characters[$i]; //echo "t=" . $text . "<br>\n"; $this->setList(&$list, $text); $this->recursive(&$list, $text, $i + 1); } } public function getList() { $list = array(); $this->recursive(&$list, "", 0); return $list; } // 順不同の文字列マッチ // "aba" と ”aab”は一緒(true) public static function isMatchInRandomOrder($text1, $text2) { $tips = self::split($text2); for ($i = 0; $i < count($tips); $i++) { $searchString = $tips[$i]; $text1 = preg_replace("/{$searchString}/", "", $text1, 1); if ($text1 == "") { break; } } if ($text1 == "" && $i == count($tips) - 1) { return true; } return false; } } $obj = new AllCombinationCharacter("abaaxyz"); foreach ($obj->getList() as $item) { echo "t=" . $item . "<br>\n"; }

    • ベストアンサー
    • PHP

専門家に質問してみよう