bugadani/recursor

一个简单的库,用于实现近似递归执行

v2.0-beta 2016-05-02 07:36 UTC

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,而应实现迭代解决方案。