0

在这里,我有一个具有挑战性的 php 函数,它应该返回一个 instanceof Traversable(迭代器),并且还需要满足测试该函数的其他断言。

函数没有错误,它计算斐波那契数。功能是可以修改的,就是专门这样构造来挑战别人的。但是有一个限制,只标记为 !!! (三个感叹号)可以更改。

public function getFibonacci($n) {
        $n2 = -($n1 = 1);
        while ($n --> -1) {
            $r = $n1 += $n2 and 0 or !!![$n + 1 => $n1];
            $n2 = $n1 - $n2;
        }
        return $r;
    }

这是一个测试getFibonacci函数的phpunit代码

assertTrue(
    ($res = (getFibonacci(8))
    && ($res instanceof \Traversable)
    && count($arr = iterator_to_array($res)) === 9
    && array_keys($arr) == range(8, 0, -1)
    && array_values($arr) == [0, 1, 1, 2, 3, 5, 8, 13, 21]
);

所以希望添加一些代码而不是!!! (三个感叹号)这样断言就会通过。

4

1 回答 1

0

这是一个生成器函数

通过 yield from 的生成器委托

在 PHP 7 中,生成器委托允许您使用 yield from 关键字从另一个生成器、可遍历对象或数组中生成值。然后,外部生成器将产生来自内部生成器、对象或数组的所有值,直到不再有效,之后将在外部生成器中继续执行。

如果生成器与 yield from 一起使用,则 yield from 表达式还将返回内部生成器返回的任何值。

$r = $n1 += $n2 and 0 or !!![$n + 1 => $n1];

PS:在 PHP 中,逻辑运算符的优先级最低。因此,这个字符串等价于

$r = $n1 += $n2;
!!![$n + 1 => $n1];
于 2019-05-11T21:18:44.360 回答