前提・実現したいこと
再帰処理で配列から値を取り出し、
Array ( [0] => 7 [1]=>3 [2]=>1)としたい。
発生している問題・エラーメッセージ
Array ( [0] => 7)となってしまう。
該当のソースコード
PHP
1 2$array=[0,1,-1,3,3,5,5,7,5,5,7,7]; 3 4function answer($a,$array){ 5 6 $solve=[]; 7 if($a===$array[$a]){ 8 array_push($solve,$a); 9 } 10 else if($a>$array[$a]){ 11 array_push($solve,$array[$a]); 12 $tmp = $a-$array[$a]; 13 } 14 if($tmp===$array[$tmp]){ 15 array_push($solve,$tmp); 16 } 17 18 if($tmp>$array[$tmp]){ 19 answer($tmp,$array); 20 } 21 22 return $solve; 23} 24print_r(answer(11,$array)); 25
試したこと
$tmpに値が渡っている事、 if($tmp>$array[$tmp]){
まで遷移していることは確認できたのできました。
恐らく再帰処理の部分に問題があるのではないかと思うのですが、それ以降原因がわかっていない状況です。
ここに問題に対して試したことを記載してください。
基礎的な内容かとは思いますが教えていただけると幸いです。
ちゃんと読んでないんでこちらにコメント書きますが、とりあえず再帰で呼び出している個所のanswerのreturnも受け取りましょう
どういう動作を期待しているのか書かずに、期待通りの動作をしないプログラムだけ示されても、どうしようもないです。
勉強不足で恐縮なのですが、今回の場合answerのreturnを受け取るというのは
return answer($tmp,$array);とするということでしょうか?
>どういう動作を期待しているのか書かずに、期待通りの動作をしないプログラムだけ示されても、どうしようもないです。
期待する動作としては、Array ( [0] => 7 [1]=>3 [2]=>1)と出力されることです。
部分和問題の一部としてこのような処理を実装しています。
11=7+3+1なので上記の動作を期待したのですが、Array ( [0] => 7)と出力されてしまいます。
> 期待する動作としては、Array ( [0] => 7 [1]=>3 [2]=>1)と出力されることです。
いやいや、それしか書いてないと、return [7,3,1]; が正解になる。
ちゃんと書きましょう。
>いやいや、それしか書いてないと、return [7,3,1]; が正解になる。
ちゃんと書きましょう。
なるほど!すいません言葉足らずでした。
本来print_r(answer(11,$array));の部分は、
$limit = $_GET['number'];
$limitInt =(int)$limit;
print_r(answer($limitInt,$array));
となっていて、GETパラメータで受け取った値となる組み合わせがあるかどうか判定するというものです。
今回は一例として$limitInt=11の時をピックアップしたためこのようになっています。
勉強不足については知りませんが、
> Array ( [0] => 7)となってしまう。
と書いてあるから多分そういう事だろうと思ってコメントしただけです
参照渡しでもいいですが余計に分からんでしょ
??
[0,1,-1,3,3,5,5,7,5,5,7,7]
と
[7,3,1]
の間に、一体どういう関係があるのか、あなたの頭の中を覗けない全くの他人に伝わるように、日本語で書いてくれと言う事ですが。
>otn
したいこととしては、集合[1,3,5,7]の部分和が12,11になる部分集合を求めることです。
その過程で動的計画法を用いて以下のような処理を行いました。
初期値がarray=[0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]の配列を用意する。
集合から一つ要素を取り出す。(m)
arrayを後ろからみていき、i+m<=11かつarray[i+m]===-1ならarray[i+m]にmを代入する。
今回、該当のソースコードで載せたのはこれらの処理が完了した後からなので、
$array=[0,1,-1,3,3,5,5,7,5,5,7,7];となっています。
この後は、配列のインデックス番号が部分和、配列の中身がそれを満たす要素を表しているためそれを抽出しようとしています。
11の場合はarray[11]=7,array[11-7]=3,array[4-3]=1なので[7,3,1]が答えといった感じです。
今回質問したのはこの部分を再帰処理を用いて実装しようとしている部分です。
伝わりますか??
>hentaiman
試してみます!
参照渡しなどについても勉強してみます。
ありがとうございます!
回答1件
あなたの回答
tips
プレビュー