- 315 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 22:55:01.73 ID:bhCkQFe7.net]
- 今のコードで $task が >>302 でいう「状態」になるわけだけど、
まず深さ優先なら再帰で書くってのは、次の depth_first_rec のように書けば $task をコードから消せる。状態管理なんてのは本質じゃないので消せるならそう書く。 function depth_first_rec($node) { echo $node->value; foreach ($node->children as $c) depth_first_rec($c); } depth_first_rec($sample); echo "\n"; 一方、幅優先を再帰で書こうとしたら、$task を再帰のパラメータに乗せなきゃならない。 関数のシグネチャはアルゴリズムの本質を表明すべきだと思うので、$task みたいなものを出したくない。これならループで書く。 もちろん関数型言語で書く人は、綺麗な関数でラップして traverse_rec みたいなのは内部に隠蔽するだろうけど、 見比べてみればそれって、>>310 の traverse が「綺麗な」外側の関数で traverse_rec が while ループに対応する。全く同じことやってる。 function traverse_rec($strategy, $task) { if ($task) { $node = $strategy($task); echo $node->value; foreach ($node->children as $c) array_push($task, $c); traverse_rec($strategy, $task); } } traverse_rec('array_shift', [$sample]); echo "\n"; traverse_rec('array_pop', [$sample]); echo "\n";
|

|