Silnia-rekurencyjnie.

0

Mam program:

 
#include <iostream>

using namespace std;

int silnia (int n)
{
if (n>1)
  return silnia(n-1)*n;
}

int main()
{
   /*wywolanie funkcji na przykład w sposób:*/
  int i = silnia(5);
  cout << i;

  return 0;
}

Rozumiem istotę silni, jednak nie rozumiem działania funkcji. Skąd wie ile razy wykonać warunek?
Tzn, gdy podam parametr np. 4... wygląda na to że powinno się wykonać (4-1)*4=12
A jednak dobrze liczy silnie, mógłby ktoś napisać czemu tak się dzieje?

1
int silnia (int n)
{
    if (n>1)
        return silnia(n-1)*n;
}

Po pierwsze, to jest źle. Jeśli n <= 1 to wychodzisz z funkcji bez zwracania wartości... To że akurat przypadkowo działa to zasługa Twojego szczęścia.

Poprawnie powinno być:

int silnia (int n)
{
    if (n>1) { return silnia(n-1)*n; }
    else { return 1; }
}

A jednak dobrze liczy silnie, mógłby ktoś napisać czemu tak się dzieje?

Bo masz szczęście, to ustaliliśmy ;]

Ale ja nie o tym. Jeśli podasz parametr 4, to wykonanie (mojej, poprawionej wersji) wygląda tak:

silnia(4) =
silnia(3) * 4 =
silnia(2) * 3 * 4 =
silnia(1) * 2 * 3 * 4 =
1 * 2 * 3 * 4

Błąd w Twoim rozumowaniu polega na tym że po podaniu parametru 4, nie wykonuje się (4-1)*4 tylko silnia(4-1)*4 co jest zupełnie czym innym.

1 użytkowników online, w tym zalogowanych: 0, gości: 1