親ノード対子ノードが「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」が返る、という理解でいいでしょうか。