gpt4 book ai didi

php - PHP 中递归函数的替代方案(避免 100 次递归的限制)

转载 作者:行者123 更新时间:2023-12-01 08:03:19 25 4
gpt4 key购买 nike

如何解决这个错误。“ fatal error 最大函数嵌套级别‘100’达到正在中止”

目前我将通过删除来修复它 “zend_extension =”/wamp/bin/php/php5.3.8/zend_ext/php_xdebug-2.1.2-5.3-vc9.dll“在 php.ini 文件中。

但是托管会出现问题。

他们是否有具有相同效率的递归函数的替代方案? :)

function MyFunction($pid)
{
echo "task..";
$obj = MainObj->method($pid);

if($obj)
{
foreach($obj as $val)
{
MyFunction($val->pid);
}
}
}

请帮助我..:)

最佳答案

您可以使用堆栈和跳过递归。如果您以相反的顺序将子元素添加到堆栈中,那么您应该获得与递归版本相同的顺序。如果顺序并不重要,则无需反转迭代。

您实际上不必理解输出的含义(因为它没有含义),只需专注于将 recurse 函数重写为 iter 函数即可。

<?php

function getObj($n)
{
return $n ? new Foo($n) : null;
}

class Foo implements IteratorAggregate
{
public $n;

public function __construct($n)
{
$this->n = $n;
}

public function getIterator()
{
$values = [];

for ($i = 0; $i < $this->n; ++$i)
{
$values[] = (int) ($i / 2);
}

return new ArrayIterator($values);
}
}

function recurse($n)
{
$obj = getObj($n);

if ($obj)
{
echo "n => ", $obj->n, "\n";
foreach ($obj as $val)
{
recurse($val);
}
}
}

function iter($n)
{
$stack = [];

$obj = getObj($n);
if ($obj)
{
$stack[] = $obj;
}

while ($stack)
{
$obj = array_pop($stack);

echo "n => ", $obj->n, "\n";

foreach (array_reverse(iterator_to_array($obj)) as $val)
{
$obj = getObj($val);
if ($obj)
{
$stack[] = $obj;
}
}
}
}


recurse(10);
echo "-----\n";
iter(10);

请注意,它们给出相同的输出,尽管如果 getObj() 有任何副作用,则两者之间的情况可能会有所不同。

关于php - PHP 中递归函数的替代方案(避免 100 次递归的限制),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18131976/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com