Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Luvun kertoman laskeminen rekursiolla

Kentti [06.12.2006 17:37:53]

#

Tässä yksinkertainen ja nopea rekursiivinen funktio luvun kertoman laskemiseen.
Luvun kertoma on luku * luku-1, luku - 1 > 1
Esimerkiksi luvun 9 kertoma on 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 362880

Tämä funktio on hyvin nopea, se laskee esimerkiksi luvun 170 kertoman (7.257415615308E+306, suurin kertoma jonka pystyy näillä konfiguroinneilla laskemaan, joku limitti iskee vastaan ku suuremmissa tule 1.#INF) kutakuinkin samassa ajassa kuin tietokoneen laskin (en osaa sanoa tarkasti, eroa ei ainakaan silmällä näe). Hidastavana riippakivenä perässä oikeastaan roikkuu Mozilla Firefox, mikä sekään ei kovin hidas ole.

<?php

  function rekursio($n, $i) {

	$i--; // Vähennetään $i:stä jokaisen kierroksen
	      //aluksi 1. Tulos muodostuu lopulta arvosta luku * $i
	$n = $n * $i; // Kerrotaan luku $n $i:llä ($n * $i)

	if ($i > 2) { // Jos $i on suurempi kuin 2, kutsutaan funktiota rekursiivisesti.
		rekursio($n, $i);
	} else 	echo $n; // Jos $i < 2, tulostetaan vastau  Mikäli laitat tämän kohdan laskutoimitusten alle, kaikki välituloksetin näkyvät
			 	// (hitaampi).
  }

  $n = 9; // Luku jonka kertoman haluat laskea.

  rekursio($n, $n); // Kutsutaan funktiota. Huomaa, että aluksi molempiin parametreihin asetetaan samat arvot, toista parametriä
			// vähennetään vasta funktion sisällä.

?>

tsuriga [07.12.2006 03:29:01]

#

Kokeilinpa noita php.netin manuskan kommentoijien funkkareita ja seuraavat kaksi olivat nopeimpia niistä neljästä, mitä testasin - kaikki olivat nopeampia kuin tämä rekursiolla suoritettu kertoma. Huono haukkua selaimen vuoksi hitaaksi - aina voi ajaa komentoriviltä.

<?php
function fact1($f) {
	$fact = $f;
	while ($fact>0)
		$f=$f*$fact--;
	return $f;
}

// tai

function fact2($int){
   for($f=2;$int-1>1;$f*=$int--);
   return $f;
}

Kentti [07.12.2006 18:15:51]

#

Kentti kirjoitti:

Hidastavana riippakivenä perässä oikeastaan roikkuu Mozilla Firefox, mikä sekään ei kovin hidas ole.

Tuolla tarkoitin, että sivu latautuu ainakin itselläni yhtä nopeasti, jos siinä on tuo funktio kuin jos siinä ei olisi.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta