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

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

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

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

Q&A

1回答

667閲覧

再起関数の返り値が期待通りにならない

avantgarden

総合スコア121

PHP

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

0グッド

0クリップ

投稿2021/06/22 17:20

編集2021/06/23 02:07

親ノード対子ノードが「1:N」で、あるノードの親ノードを順に探していって、親ノードがいくつあるのかを出力するために、再起関数を用いました。

ノードはDBで言うとレコードのことで、ノードIDと親ノードIDのカラムがあります。(ノードIDは一意です)

実際は、そのノードに親ノードがあれば、親ノードIDを使って、親ノードのさらに親ノードを探す→そのまた親ノードがあれば・・・を繰り返します。

その際に再起関数を使っているのですが、期待通りの結果が得られません。

単純化して検証するために下記のような関数で試しましたが、意図しない結果が同じように出ます。

function increm($i) { if ($i < 5) { $i++; increm($i); } return $i; } $a = increm(0); var_dump($a);

この結果がint(5)になって欲しいのですが、実際はint(1)になります。

試しにreturn $iの直前で$iを出力してみたコードが下記なのですが

function increm($i) { if ($i < 5) { $i++; increm($i); } var_dump($i); return $i; } $a = increm(0); // var_dump($a);

結果はint(5) int(5) int(4) int(3) int(2) int(1)という(私にとっては)奇妙な結果になります。

実際の動きからすると私の認識が間違っているのですが、私の認識では、最初のコードで

if ($i < 5) { $i++; increm($i); }

の部分が繰り返され、最終的に「5」になった$iがreturnされるものと思ってたのですが、実際はどのような動きになっているのでしょうか。

また、再起関数を使って期待通りの「5」を得るには、最初に書いたコードをどのように修正すれば良いでしょうか。

【追記】
https://teratail.com/questions/52947

上記の質問での回答内容を参考に

function increm($i) { if ($i < 5) { $i++; return increm($i); } return $i; } $a = increm(0); var_dump($a);

としたところ、期待するint(5)が出力されました。
(if文のincrem($i)の前にreturnを追加しました)

最初の関数の呼び出しから順にたどると

increm(0) = increm(1) increm(1) = increm(2) increm(2) = increm(3) increm(3) = increm(4) increm(4) = increm(5) increm(5) = 5 ←$iがそのまま返る

※「=」は数学のイコールの意味で書いてます

となるので結果的に「5」が返る、という理解でいいでしょうか。

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

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

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

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

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

hoshi-takanori

2021/06/22 18:44

再帰の結果を使ってないからでは。
yambejp

2021/06/23 00:25

nodeの具体例がないと検証ができないので回答がぶれます
guest

回答1

0

実際はどのような動きになっているのでしょうか。

$i関数の呼び出しごとに作られます。最初に呼び出したincrem(0)の中での$iは、$i++とされたきりで、それ以上変化しません。

投稿2021/06/22 22:46

maisumakun

総合スコア145184

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

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

avantgarden

2021/06/23 02:07

ありがとうございます。 追記に記載した理解で合ってますでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問