Стек результатов рекурсии - PullRequest
0 голосов
/ 30 января 2011

Какой самый простой способ передать результат этой рекурсивной функции обратно?

function recursion_trigger($input, $count = 0){

        if(!empty($input)){
                array_pop($input);
                $count++;
                if(!empty($input)){
                recursion_trigger($input,$count);
                }
        }

echo $count;
return $count;


}

В данный момент он возвращает самый верхний вызов, который, конечно, равен единице.

/////// В качестве дополнительного вопроса это полная функция. Можете ли вы использовать хвостовую рекурсию здесь? Выходные данные - это массив, который я создаю при прохождении значений.

<?php    
//Page best viewed from page source 

 //Takes an array of objects that have ID and Parent and organizes the tree into an array representing a set of objectID's by depth 

 // poor spelling ahead =P

function level_keys($array,$depth=-1,$level=0,$output=null){

// initialize the functions parameters run once at start and not in subsequent self calls

if($level == 0 && $depth != 0){
    $output[][]=0;
    $level++;
        foreach($array as $key=>$node){
            if($node->parent==0){
                $output[$level][] = $node->id;
                unset($array[$key]);
            }
        }
            unset($key); unset($node);
$level++;
$depth--;

}

// set recursion loop and run main part of function

if (  !empty($array) && $depth != 0){

    echo 'depth:'.$depth."\n";

    foreach($output[$level-1] as $parent){  
        foreach($array as $key=> $child){
            if( $parent == $child->parent){
            $output[$level][] = $child->id;
            unset($array[$key]);
            }
        }
    }
        unset($id); unset($parent); unset($key); unset($child);
$depth--;
$level++;
        if(!empty($array) && $depth !=0 ){
            // make sure to pass the output back out to the top most level
            $output = level_keys($array,$depth,$level,$output,$depth_at);
        }
}

return $output;

}
?>

Ответы [ 3 ]

1 голос
/ 30 января 2011

Вероятно, вы думали так, как если бы $count был постоянным, тогда как это произошло не из-за вызова по значению. Эта версия, используя ссылки, также работает.

function recursion_trigger($input, &$count = 0){

        if(!empty($input)){
                array_pop($input);
                $count++;
                if(!empty($input)){
                recursion_trigger($input,$count);
                }
        }

echo $count;
return $count;


}
1 голос
/ 30 января 2011

Полагаю, что вам действительно нужно не подсчитывать количество элементов в массиве.

Когда вы выполняете рекурсивные функции, подобные этой, это хорошо для производительности, если они хвостовые рекурсивныеЯ не уверен, что PHP имеет эту оптимизацию, я надеюсь, что так).Здесь у вас есть $ count, который может служить аккумулятором, но не используйте его.

function recursion_trigger ($input, $count = 0)
{
  if (!empty($input)) {
    array_pop($input);
    return recursion_trigger($input, $count + 1);
  }
  return $count;
}

Таким образом, он работает и является хвостовым рекурсивным: -).

1 голос
/ 30 января 2011

Вам следует обновить переменную $count, вернув значение recursion_trigger

if(!empty($input)){
    $count = recursion_trigger($input,$count);
}

EDIT:

Надеемся, что следующее поможет вам визуализировать, как это работает:

recursion_trigger ( array("This", "Is", "A", "Sample"), 0)
  recursion_trigger ( array("This", "Is", "A"), 1)
    recursion_trigger ( array("This", "Is"), 2)
      recursion_trigger ( array("This"), 3)
        recursion_trigger ( array(), 4)
...