rekurencja - jak to działa

0

Witam, mógłby krok po kroku ktoś mi wytłumaczyć jak działa metoda Silnia w tym kodzie ?

class rekurencja
    {
        public int Silnia(int i)
        {
            if (i != 1)
                return (i-1) * i;
            else
                return 1;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            rekurencja R = new rekurencja();
            Console.WriteLine(R.Silnia(6));
            Console.Read();
        }
    } 
0

Ni jak, bo w tym kodzie jej nie ma.
Jeśli umiesz mnożyć, to rozumiesz funkcję, jaką masz w kodzie (to nie jest silnia). (i-1) * i
(oczywisty proof: http://ideone.com/1abAx3)

3

Na (poprawionym) przykładzie:

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

Rozpatrzymy jak przebiega wykonanie dla silnii 5:

=> silnia(5)
=> 5 * silnia(4)
  // n jest wieksze od 1, wiec podstawiamy 5 pod wyrazenie wewnatrz else
  // ewaluujemy przy okazji parametr przekazywany do funkcji
=> 5 * (4 * silnia(3))
  // robimy dokladnie to samo co wyzej, z tym ze musimy pamietac o pomnozeniu przez 5 z poprzedniej linijki
=> 5 * (4 * (3 * silnia(2)))
=> 5 * (4 * (3 * (2 * silnia(1))))
  // teraz dochodzimy do przypadku bazowego, wiec pod silnia(1) podstawiamy wartosc 1
=> 5 * (4 * (3 * (2 * 1)))
  // odwijamy po kolei wynik
=> 5 * (4 * (3 * 2))
=> 5 * (4 * 6)
=> 5 * 24
=> 120
0

Jak zrozumiesz działanie stosu i jak wygląda wywołanie i 'przejście' przez funkcję na niższym poziomie to będzie ci łatwiej pojąć działanie rekurencji.
noname zrobił też ładny schemat, które może pomóc.

0

Ok, dzięki Panowie.

Przerabiam sobie kurs C# z 4programmers, i tam rekurencja odnosiła się do przykładu wstawionego przeze mnie.

Miałem stosy i kolejki na algorytmach to może jakoś ogarnę.

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