Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: kertoma funktio

javerkki [21.04.2005 17:35:10]

#

Onko c++ olemassa jotain valmista kertoma funktiota?
Jos ei ole valmista funktiota niin miten tämä ohjelma kannattaisi toteuttaa?.

Eli jos annetaan vaikka luku 5 niin ohjelma toteuttaa seuraavaa:

(1/1)+ (1/1*2) + (1/1*2*3) + (1/1*2*3*4) + (1/1*2*3*4*5)

Deewiant [21.04.2005 18:11:43]

#

Ei löydy valmiina. Sen voi toteuttaa kahdella tavalla, toinen on hitaampi mutta lähempänä matemaattista määrittelyä, ja toinen on nopea.

Ensimmäinen, hitaampi, käyttää rekursiivisuutta hyväkseen jotenkin tyyliin:

int fact(int n)
{
   if (n == 0) return 1;
   else if (n < 0) return 0; // ei käy
   else return fact(n - 1);
}

En ajatellut tuota toteutusta hirveästi, se voi olla pielessä.

Kuitenkin, toinen tekniikka iteroi. Tätä en ole koskaan yrittänytkään toteuttaa, mutta parin minuutin ajatuksella veikkaisin että menisi jotenkin näin:

int fact(int n)
{
  int answer = 1;

  if (n == 0) return 0; // ei käy täälläkään
  while (n > 0)
    answer *= n--;
  return answer;
}

Olenpas avuliaalla päällä... tavallisesti olisin käskenyt tänne.

javerkki [21.04.2005 18:39:38]

#

Ok. Kiitos paljon neuvoista.

Jaska [22.04.2005 17:26:06]

#

Nuo ovat Deewiant molemmat hitaita algoritmeja kertoman toteuttamiseen. Gammafunktion avulla saadaan kertoma laskettua nopeammin.

Blaze [22.04.2005 18:39:20]

#

Jos osataan :)
http://fi.wikipedia.org/wiki/Gammafunktio

Deewiant [22.04.2005 18:41:08]

#

Voi olla totta. Yritin testata, mutta ongelmaksi tuli se, että double loppuu kesken turhan aikaisin. Repäisin tästä PDF:stä toteuksen gammafunktiolla ja testailin vähän, ja tuo iterointitekniikka oli kyllä nopeampi niillä pienillä luvuilla, joita double syö.

Jos saat jonkin fiksun toteutuksen aikaiseksi, jossa nopeusero näkyy selvästi, postaa vain tänne. Jos tuo tekniikka on oikeasti nopeampi, otan sen mieluusti itse käyttöön.

Ja olihan noissa molemmissa minun toteutuksissa virhe. Rekursiivisen kuuluu palauttaa tietysti n * fact(n -1), ja iteroivassa if-lausekkeen sisään tulee n < 0. Sen siitä saa kun ei ajattele...

Vastaus

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

Tietoa sivustosta