Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Dodatkowe matariały] Funkcje kolejne aspekty

Ostatnio zmodyfikowano 2015-01-10 13:02
Autor Wiadomość
PCS
Temat założony przez niniejszego użytkownika
[Dodatkowe matariały] Funkcje kolejne aspekty
» 2015-01-09 21:57:35
Witam, mam problem z interpretacją pewnego kodu z tej lekcji, mianowicie:

C/C++
//Silnia, jako przykład funkcji rekurencyjnej
#include <conio.h>
#include <iostream>

long long Silnia( long long n );
int main()
{
    using std::cout;
    int n = 3, silnia;
    silnia = Silnia( n );
    /*wywołanie funkcji dla n=3
           obliczenie funkcji dla n=3*/
    cout << "\nSilnia (" << n << ") = " << silnia;
    getch();
    return 0;
}

long long Silnia( long long n )
{
    using std::cout;
    int k;
    cout << "wejsce do funkcji dla n = " << n << "\n";
    /* kolejno
             wejsce do funkcji dla n=3
             wejsce do funkcji dla n=2
             wejsce do funkcji dla n=1*/
    if( n <= 1 ) {
        k = 1;
        cout << "return k = " << k << "\n";
        //obliczenie funkcji (k) dla n=1
        return k;
    }
    else {
        k = n * Silnia( n - 1 );
        /*kolejno wykonywane są:
                     wywołanie funkcji dla n=2
                     wywołanie funkcji dla n=1
                     (funkcja dwukrotnie wywołała samą siebie)
                     obliczenie funkcji dla n=2
                     obliczenie funkcji dla n=3
                     (funkcja dwukrotnie obliczyła k)*/
        cout << "return k = " << k << "\n";
        return k;
    }
}

Mój problem polega na tym, iż nie mogę zrozumieć co się dzieje, gdy wejdziemy w warunek if i zwracamy zmienną k - dalej już nie pojmuję co się dzieje. Z tego kodu wynika, że 'k' z warunku if zwracamy do tego skrawka kodu?
k = n * Silnia( n - 1 );
Dzięki z góry za odpowiedź.
P-124528
Fireho
» 2015-01-09 23:21:55
Silnia to coś takiego, że 1! to 1, 2! to 1*2 = 2, 3! to 1*2*3 = 6, 4! to 1*2*3*4 = 24, 5! to 1*2*3*4*5=120 itd..

Ta funkcja działa tak:
- dostaje jakąś wartość, np. 5
- jeśli dostanie 1 lub mniejszą, zwraca 1(bo przecież 1! to 1)
- jeśli nie, zwraca aktualną wartość pomnożoną przez silnię z wartości mniejszej o 1 od obecnej - czyli wywołuje samą siebie z wartością mniejszą o 1
I tak to się powtarza, dopóki wartość nie zostanie zredukowana do 1. I wtedy się zacznie: ostatnie wywołanie zwróci 1, to przed nim obliczy 2*1 i zwróci 2, to jeszcze przed nim obliczy 3*2 i zwróci 6, to jeszcze przed nim obliczy 4*6 i zwróci 24, a funkcja wywołana na początku obliczy 5*24 i zwróci 120.

Na tym polega rekurencja - odwoływanie się do samego siebie.
P-124544
PCS
Temat założony przez niniejszego użytkownika
» 2015-01-10 13:02:04
Dzięki wielkie, teraz wszystko jasne.
P-124554
« 1 »
  Strona 1 z 1