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

Rozdz. 18.3 Dydaktyczna wersja silnii "rekurencyjnej"

Ostatnio zmodyfikowano 2010-04-09 10:32
Autor Wiadomość
marek
Temat założony przez niniejszego użytkownika
Rozdz. 18.3 Dydaktyczna wersja silnii "rekurencyjnej"
» 2010-03-13 16:26:23
Przyznam się szczerze, że jako początkujący musiałem się trochę poboksować z funkcją rekurencyjną.
Zaproponowany na kursie przykład jest bardzo elegancki i krótki. Wadą jest natomiast to że nie widać jak np dla n=3  jedna funkcja wywołuje drugą:
main()-->Silnia(n=3)--> Silnia(n=2))--> Silnia(n=1)-->Silnia(n=2)-->
Silnia(n=3)--> main()
Proponuję wyrażenie Silnia(n-1)*n zastąpić wyrażeniem n*Silnia(n-1).
Dla kompilatora "wsio ryba", a dla człowieka to drugie jest bardziej jednoznaczne.
Dla celów dydaktycznych wywoływanie funkcji usunąłem ze strumienia, chociaż jest to dopuszczalne.
Przy okazji. Zapomniałem jak się edytuje na forum kod źródłowy żeby były kolorki.
C/C++
//Odliczanie inne spojrzenie przykład z kursu 8.2
#include <conio.h>
#include <iostream>

long long Silnia( long long n );
int main()
{
    using std::cout;
    int n = 3, silnia;
    silnia = Silnia( n );
    cout << "\nSilnia(" << n << ") = " << silnia;
    getch();
    return 0;
}

long long Silnia( long long n )
{
    using std::cout;
    int k;
    if( n <= 1 ) {
        cout << "n = " << n << "\n\n";
        k = 1;
        cout << "Silnia(" << n << ") = " << k << "\n";
        return k;
    }
    else {
        cout << "n = " << n << "\n";
        k = n * Silnia( n - 1 );
        cout << "Silnia(" << n << ") = " << k << "\n";
        return k;
    }
}
P-14964
GoldWolf
» 2010-04-08 11:07:09
Marek napisz do tego jakieś 2 - 3 zdania wyjaśnienia albo jakieś komentarze. Teraz nie mam czasu się tym bawić.
P-15922
marek
Temat założony przez niniejszego użytkownika
Jeszcze bardziej "dydaktyczna" wersja funkcji rekurencyjnej
» 2010-04-09 10:32:44
Tu chyba dokładnie widać jak funkcja main wywołuje funkcję Silnia(n) i dalej jak Silnia(n) wywołuje samą siebie:
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;
    }
}
Po pozbyciu się komentarzy i pośrednich wydruków, czyli całej otoczki dydaktycznej, program będzie oczywiście krótszy:
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;
    cout << "Silnia (" << n << ") = " << Silnia( n );
    getch();
    return 0;
}
long long Silnia( long long n )
{
    using std::cout;
    int k;
    if( n <= 1 ) {
        k = 1;
        return k;
    }
    else {
        k = n * Silnia( n - 1 );
        return k;
    }
}
Przy okazji warto zmienić komentarz z pierwszej linijki na taki jaki jest w moim przykładzie. Komentarz:
//Odliczanie inne spojrzenie przykład z kursu 8.2
 nie powinien mieć odniesienia do p. 8.2 ani do odliczania

Dante: Wprowadzono
P-15953
« 1 »
  Strona 1 z 1