递归结果栈
将递归函数的结果传回的最干净的方法是什么?
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;
}
?>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我想你真正需要的不是计算数组中元素的数量。
当你执行像这样的递归函数时,如果它们是尾递归的,那么对性能会有好处(事实上,我不确定 php 是否有这种优化,我希望如此)。这里有 $count 可以用作累加器,但不要使用它。
这样它就可以工作并且是尾递归的:-)。
I guess what you really need is not to count the number of elements in an array.
When you do recursive functions like this one, it is good for performance if they are tail-recursive (in fact, I'm not sure php has this optimisation, I hope so). Here you have $count that can serve as accumulator but don't use it.
This way it works and is tail recursive :-).
您应该使用
recursion_trigger
的返回值更新您的$count
变量编辑:
希望以下内容能够帮助您直观地了解它的工作原理:
You should update your
$count
variable with the return value ofrecursion_trigger
EDIT:
Hopefully the following will help you visualise how it's working:
您的想法可能是沿着
$count
是持久的,而它不是因为按值调用。这个版本,使用参考文献,也有效。The way you were thinking probably was along the lines that
$count
was persistent, whereas it isn't because of call by value. This version, using references, also works.