Php 发电机应该是懒惰的吗?

Php 发电机应该是懒惰的吗?,php,Php,我试图用PHP计算第n个素数: function is_prime($n) { if ($n <= 1) { return false; } elseif ($n <= 3) { return true; } elseif (($n % 2 == 0) || ($n % 3 == 0)) { return false; } $i = 5; while ($i * $i <= $n

我试图用PHP计算第n个素数:

function is_prime($n) {
    if ($n <= 1) {
        return false;
    } elseif ($n <= 3) {
        return true;
    } elseif (($n % 2 == 0) ||  ($n % 3 == 0)) {
        return false;
    }

    $i = 5;
    while ($i * $i <= $n) {
        if (($n % $i == 0) || ($n % ($i + 2) == 0)) {
            return false;
            $i = $i + 6;
        }
    }
    return true;
}

function prime_gen() {
    for($x=0; $x< PHP_INT_MAX; $x++) {
        if(is_prime($x)){
            yield $x;
        }
    }
}


function nth_prime($n) {
    for($i=0; $i<=$n; $i++) {
        $ps = iterator_to_array(prime_gen());
    }

    return $ps[$n-1];
}

echo nth_prime(9);
函数为素数($n){

if($n
迭代器到数组
迭代整个生成器,直到它耗尽并在数组中给出结果。生成器是“惰性的”,但您明确地打破了这一点,并强制对整个生成器进行求值。此外,您是在循环中进行此操作的。您几乎只需要去掉
迭代器到数组
。更好的解决方案:

$nth = 0;
foreach (prime_gen() as $prime) {
    if (++$nth >= $n) {
        break;
    }
}

return $prime;

iterator\u to\u array
对整个生成器进行迭代,直到其耗尽并在数组中给出结果。生成器为“惰性”,但您明确地打破了这一点,并强制对整个生成器进行求值。此外,您是在循环中进行此操作的。您几乎只需要去掉
迭代器到数组
。更好的解决方案:

$nth = 0;
foreach (prime_gen() as $prime) {
    if (++$nth >= $n) {
        break;
    }
}

return $prime;