PHPの再帰問題

WBOY
WBOYオリジナル
2016-06-23 14:24:001070ブラウズ

この投稿は qq43599939 によって最終編集されました: 2013-08-28 12:42:25

<?php    $area = array(          0=>array('id'=>1,'name'=>'中国','pid'=>0),          1=>array('id'=>2,'name'=>'北京','pid'=>1),      );      print_r(catsort($area));     function catsort($cate, $pid = 0){        $arr = array();        foreach($cate as $v){            if ($v['pid'] == $pid){                $arr[] = $v;                $arr = array_merge($arr, catsort($cate ,$v['id']));                //$arr[] = $v;            }        }        return $arr;        }    ?>

この質問は私を非常に混乱させます、なぜ $arr[] = $v が $arr = array_merge($arr, catsort に配置されるのか) ($ cate ,$v['id'])) 前回のリターンは、最初に中国、次に北京です。しかし、これが $arr = array_merge($arr, catsort($cate,$v['id'])) の後に配置されると、北京が最初になり、次に中国になるでしょうか。詳細な説明を手伝ってください、ありがとうございます

ディスカッション (解決策) への返信

少なくとも本の横断については読んだはずですよね?
再帰とは、ツリーを走査することです

ノードへのアクセス操作が発生する場所に応じて名前が付けられます:
① NLR: Preorder Traversal (Preorder Traversal とも呼ばれます)
??ルート ノードへのアクセス操作は、ルート ノードを走査するときに発生します。木の前の左右の子供たち。
② LNR: Inorder Traversal (InorderTraversal)
??ルートノードにアクセスする操作は、その左右のサブツリーのトラバース中に発生します。
③ LRN: Postorder Traversal
??ルート ノードにアクセスする操作は、左右のサブツリーを走査した後に発生します。

$arr[] = $v は $arr = array_merge($arr, catsort($cate,$v['id'])) の前に配置されます
は事前順序走査
の前に配置されます$arr = array_merge($arr, catsort($cate,$v['id'])) はポストオーダートラバーサルです

では、なぜ前に置くとプレオーダーになり、後ろにポストオーダーになるのでしょうか?よくわかりませんが、もっとわかりやすく説明していただけませんか?

        foreach($cate as $v){            if ($v['pid'] == $pid){                $arr[] = $v;                $arr = array_merge($arr, catsort($cate ,$v['id']));                //$arr[] = $v;            }        }


後ろに配置した場合、外側の array_merge 関数が第 2 パラメータ「catsort($cate,$v['id'])」を処理するときに、再帰的に内側の層に入り、「$arr」を実行します。内側の層 []=$v" を実行し、最初に配列に北京を追加してから、外側の層に戻って外側の層の "$arr[]=$v" を実行します。

わかりました、ありがとう

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。