bugadani / recursor
一个简单的库,用于实现近似递归执行
v2.0-beta
2016-05-02 07:36 UTC
Requires
- php: >=7.0
Requires (Dev)
- phpunit/phpunit: 4.*
This package is not auto-updated.
Last update: 2024-09-14 18:42:11 UTC
README
Recursor通过利用PHP的生成器功能,以迭代方式实现递归算法的执行。这特别有用,因为可能存在易于递归实现但难以迭代的算法。此外,PHP对递归施加了人工的嵌套限制。
要使用Recursor将递归函数转换为近似递归函数,基本上只需要将return
关键字替换为yield
,递归函数调用也应该以yield
开头。
一个生成第n个斐波那契数的示例
$fibonacci = function ($x) use (&$fibonacci) {
if ($x === 0) {
yield 0;
} else if ($x === 1) {
yield 1;
} else {
$x1 = (yield $fibonacci($x - 1)); //retrieves return value of recursive call
$x2 = (yield $fibonacci($x - 2));
yield $x1 + $x2; //yielding a non-generator acts as a return
}
};
$wrapped = new Recursor($fibonacci);
$wrapped(5); // returns 5
$wrapped(6); // returns 8
注意
- Recursor是为PHP 5.5构建的。这意味着PHP7的生成器返回不被支持。作为解决方案,函数将返回它产生的第一个非生成器值,因此它们将无法生成序列。
- 如果您希望产生一个不应执行的生成器,可以将其包装在
\IteratorIterator
或自定义包装器中。
缺点
Recursor严重依赖于生成器。每次递归调用都会实例化和执行一个生成器,这会产生一定的CPU和内存开销。此外,实际的执行函数相当复杂,这又增加了更多的开销。因此,在性能敏感的应用程序中不建议使用Recursion,而应实现迭代解决方案。