2016-05-16 54 views
0

我試圖計算在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++)

回答

2

iterator_to_array迭代整個整個生成器,直到它耗盡並給出數組結果。 生成器是「懶惰」,但你明確地打破了這一點,並迫使整個生成器的評估。而且,你正在做在一個循環中。你幾乎只需要擺脫iterator_to_array。更好的解決方案:

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

return $prime;