next up previous
Next: Geometrijsko zaporedje Up: Devete vaje iz racunalnistva Previous: Devete vaje iz racunalnistva

Dopolnilo k zgledu zaporedj.c

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:

1.
najprej sestejemo ostale clene zaporedja z ukazom:
 vsota = sestej_zaporedje1(zacetni_clen + korak, korak,
                           stevilo_clenov - 1);

2.
vsoti pristejemo se zacetni clen aritmeticnega zaporedja z:

\begin{displaymath}\texttt{vsota += zacetni\_clen;}
\end{displaymath}

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 */



Andrej Brodnik (Andy)
1998-12-30