优化非尾递归函数

时间:2009-04-17 23:43:50

标签: php optimization recursion

我有这个功能,其基本操作概述如下:

function render($index) {
    foreach($things[$index] as $key => $data) {
        echo '<div>';
        /* irrelevant operations */
        if(isset($data['id'])) {
            echo '<div class="wrap">';
            render($things[$data['id']]);
            echo '</div>';
        }
        echo '</div>';
    }
}

我不能为我的生活弄清楚如何优化这个功能;我担心如果调用堆栈太大,PHP会崩溃。

有没有办法优化这个功能?

4 个答案:

答案 0 :(得分:9)

你不得不担心,这是非常值得怀疑的。如果你的div足够深,使得调用堆栈填满,那么递归深度是你最不担心的。

答案 1 :(得分:3)

你正在做的是有效地遍历一棵树。基本上,这并不比仅打印树中的所有值更糟糕。它是否因为它太大而遇到任何特定的麻烦?这棵树的嵌套程度有多深?

答案 2 :(得分:3)

您不需要使用递归来对树进行深度优先遍历;它恰好工作真的很好。如果吹嘘你的筹码是一个问题,你可以在所有元素上运行一个长循环,只保持最后和当前位置。递归是一种更简单且(通常)更好的方式来执行深度优先遍历。

答案 3 :(得分:3)

此代码未经测试,但从我的头脑中,迭代函数看起来应该是这样的:

function render($index){
    $stack = array();
    array_push($index);

    $pre = '';
    $post = '';

    while(!empty($stack)){
        $idx = array_pop($stack);

        foreach($things[$idx] as $key => $value){
            $pre .= '<1>';
            $spost = '';

            if(isset($data['id'])){
                $pre .= '<2 class="wrap">';
                $spost .= '</2>';

                $stack[] = $things[$data['id']];
            }

            $spost .= '</1>';
            $post .= $spost;
        }
    }

    return $pre . $post;
}