2016-05-16 7 views
0

Ich habe versucht, den n-te Primzahl in PHP zu berechnen:Soll der Generator faul sein?

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); 

Ich habe Maximum execution time of 3 seconds exceeded Fehler. Soll der Generator faul sein? Sollte ich nicht for($x=0; $x< PHP_INT_MAX; $x++) schreiben?

Antwort

2

iterator_to_array Iteriert die gesamte Generator, bis es erschöpft ist und gibt Ihnen das Ergebnis in einem Array. Der Generator ist "faul", aber Sie brechen das explizit und erzwingen die Auswertung des gesamten Generators. Darüber hinaus machst du , dass in einer Schleife. Sie müssen nur iterator_to_array loswerden. Bessere Lösung:

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

return $prime;