質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Q&A

解決済

2回答

2098閲覧

部分和問題の再帰処理について

teaAI

総合スコア36

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

1グッド

2クリップ

投稿2018/10/31 16:04

PHP

1// 部分和問題 2$arr =[1,2,4,7]; 3$k=13; 4$n=4; 5 6function depth($arr, $k,$n,$sum=0, $i=0){ 7 if($i == $n) { 8 return $sum == $k; 9 }; 10 // 再帰A 11 if(depth($arr, $k,$n, $sum, $i+1)){ return true; } 12 // 再帰B 13 if(depth($arr, $k,$n, $sum+$arr[$i], $i+1)){ return true; } 14 15 return false; 16 17} 18 19var_dump(depth($arr, $k,$n,0,0));

上記のような関数があった時、再帰A,Bがどのような順序で呼ばれ、処理が終了するのか理解できません。
理解の助けとなる、サンプルやアイディアがあればご教授願います。

※再帰処理の特性として下記は多少なりとも理解しています。
・FILO(スタック)
・終了条件を定義する

set0gut1👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

イメージ説明

こんな感じの2分木を深さ優先探索します。青が false 部分、赤が true 部分、点線部が探索を行わなかった部分だと思ってください。

一番下まで来てれば $k と $sum の比較で true か false を返します。

中間層では、左側の探索(再帰A、$i番目の値を使わないケース)が true を返してくれば、そのまま上に true を返し、右側の探索は行わないです。
左側の探索が false を返してきた時は右側の探索(再帰B、$i番目の値を使うケース)を行い、これが true を返してくれば、上に true を返します。

どちらでもないケース、つまり左側も右側も false を返してきたケースでは、上に false を返します。

投稿2018/10/31 18:14

編集2018/10/31 18:57
set0gut1

総合スコア2413

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2018/10/31 18:21

透過PNGになってるせいか拡大画像で文字が全く読めなくなってる
set0gut1

2018/10/31 18:25

ありがとうございます!白背景画像に差し替えました。
teaAI

2018/11/10 09:02

わかりやすい図まで作成してくれてありがとうございます。 大変勉強になりました。
guest

0

ざっくり説明するなら、Xを使わない、Oを使うとして、
[XXXX][XXXO][XXOX][XXOO]...のように走査して、和が目的の13になる組み合わせがあるかどうかを探しています。

投稿2018/10/31 17:39

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問