2011-01-30 111 views
0

将这个递归函数的结果返回的最简洁的方法是什么?递归结果堆栈

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; 

} 
?> 

回答

1

我想你真正需要的不是计算数组中元素的数量。

当你做这样的递归函数时,如果它们是尾递归的(实际上,我不确定PHP是否有这种优化,我希望如此),它对性能是有好处的。这里有$ count可以用作累加器,但不要使用它。

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

这种方式工作,是尾递归:-)。

1

您应该返回值更新$count变量recursion_trigger

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

编辑:

希望以下将帮助你想象它是如何工作的:

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) 
+0

谢谢你完全是这样。我明白它为什么可行,但我仍然无法想象它是如何工作的。 – Prospero 2011-01-30 15:36:47

+0

@Doodle:查看更新后的帖子。 – 2011-01-30 15:41:50

1

你在想的方式可能是沿着林es $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; 


} 
+0

我曾经考虑过,但这最终将成为Java中的一个函数。我只是试图想象一切如何运作,PHP是一种非常快速的语言。谢谢。 – Prospero 2011-01-30 20:51:57