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)
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.
Ok. Kiitos paljon neuvoista.
Nuo ovat Deewiant molemmat hitaita algoritmeja kertoman toteuttamiseen. Gammafunktion avulla saadaan kertoma laskettua nopeammin.
Jos osataan :)
http://fi.wikipedia.org/wiki/Gammafunktio
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...
Aihe on jo aika vanha, joten et voi enää vastata siihen.