Na prejsnjih vajah smo s pomocjo rekurzije napisali program, ki nam je racunal clene in vsoto poljubnega aritmeticnega zaporedja. Pri programu je bila tezava, da se cleni niso nehali izpisovati, ker program ni imel ustavljalnega pogoja in se je izvajal v neskoncnost. Naj ponovim, zaporedje smo sestevali takole:
vsota = sestej_zaporedje1(zacetni_clen + korak, korak, stevilo_clenov - 1);
Pri tem je nastala prej omenjena tezava. Program se ni znal ustaviti, saj je poskusal sesteti neskoncno aritmeticno zaporedje.
Pri sestevanju zaporedja smo zato omejili stevilo
sestetih clenov. Koliko clenov smo sesteli doloca
parameter int stevilo_clenov
, ki se nahaja v glavi definicije
funkcije:
int sestej_zaporedje1(int zacetni_clen, int korak, int stevilo_clenov)}
Dokoncno napako popravimo takole:
Dodati moramo pogoj, ki, ko je stevilo clenov aritmeticnega
zaporedja 0, vrne vsoto 0 (kot nam to prikaze program). V
primeru, ko je stevilo clenov zaporedja vecje od 0, je
vsota enaka vsoti preostalih clenov aritmeticnega zaporedja,
ki ji pristejemo zacetni clen. To izvedemo z:
int sestej_zaporedje1(int zacetni_clen, int korak, int stevilo_clenov) { int vsota; if(stevilo_clenov ==0) vsota =0; else { /* sestej ostale clene zaporedja */ vsota = sestej_zaporedje1(zacetni_clen + korak, korak, stevilo_clenov - 1); /* pristej zacetni clen */ vsota += zacetni_clen; }; /* vrni vsoto */ return vsota; } /* sestej_zaporedje1 */