我试图在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);
我遇到Maximum execution time of 3 seconds exceeded
错误。发电机应该是懒惰的吗?我不应该写for($x=0; $x< PHP_INT_MAX; $x++)
吗?
答案 0 :(得分:2)
iterator_to_array
迭代整个生成器,直到它耗尽并在数组中提供结果。 生成器是&#34;懒惰&#34;,但是你明确地打破了它并且正在强制评估整个生成器。而且,你在循环中 。你几乎只需要摆脱iterator_to_array
。更好的解决方案:
$nth = 0;
foreach (prime_gen() as $prime) {
if (++$nth >= $n) {
break;
}
}
return $prime;