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

Wyjaśnienie rekurencji na przykładzie

Ostatnio zmodyfikowano 2013-06-05 22:02
Autor Wiadomość
monalisa001
Temat założony przez niniejszego użytkownika
Wyjaśnienie rekurencji na przykładzie
» 2013-06-01 00:22:18
Witam was bardzo ciepło! Jestem początkująca w C++, a już muszę zmierzyć się z problemem, który stoi mi na przeszkodzie od wielu godzin, a nie potrafię go przeskoczyć. Dokładnie chodzi o rekurencję, mam konkretny przykład, który muszę zrozumieć, jednak kompletnie nie wiem w jaki sposób on działa, a próbowałam już w różny sposób do tego podejść. Byłabym bardzo wdzięczna i dłużna, gdyby ktoś wyjaśnił mi krok po kroku, jak dla kompletnego laika, w jaki sposób działa ten programik i dlaczego które wywołanie funkcji dzieje się w danym momencie i co to robi ze zmiennymi.

C/C++
#include<iostream>
using namespace std;

void wyk( int a, int b ) {
    if( a == 0 )
         return 0;
    else {
        wyk( a - 1, b + 1 );
        cout << a << " : " << b << endl;
        wyk( a - 1, b + 1 );
    }
}

int main( int a, int b ) {
    wyk( 4, 0 );
   
    system( "pause" );
    return 0;
}
P-84514
pekfos
» 2013-06-01 16:03:49
Program ma 2 błędy: Zwracanie zera w funkcji nic nie zwracającej i nieprawidłowa definicja main().

Rekurencja polega na wywołaniu tej samej funkcji, najczęściej z innymi argumentami. W Twoim programie w main() wywołujesz wyk(4, 0), które dla a innego od zera dwukrotnie wywołuje samą siebie ze zmodyfikowanymi argumentami. Można to rozpisać tak:
main(...)
    wyk(4, 0)
        wyk(3, 1)
            wyk(2, 2)
                wyk(1, 3)
                    wyk(0, 4)
                    wyk(0, 4)
                wyk(1, 3)
                    wyk(0, 4)
                    wyk(0, 4)
            wyk(2, 2)
                wyk(1, 3)
                    wyk(0, 4)
                    wyk(0, 4)
                wyk(1, 3)
                    wyk(0, 4)
                    wyk(0, 4)
        wyk(3, 1)
            wyk(2, 2)
                wyk(1, 3)
                    wyk(0, 4)
                    wyk(0, 4)
                wyk(1, 3)
                    wyk(0, 4)
                    wyk(0, 4)
            wyk(2, 2)
                wyk(1, 3)
                    wyk(0, 4)
                    wyk(0, 4)
                wyk(1, 3)
                    wyk(0, 4)
                    wyk(0, 4)
Wywołania przestają się rozgałęziać, gdy pierwszy argument funkcji wyk() ma wartość 0. Po wyjściu z funkcji, program kontynuuje wykonanie nadrzędnej funkcji i tak dalej, aż wróci do main().
P-84539
usmiech
» 2013-06-01 18:53:19
Chyba najlepiej rekurencje  /albo rekursje.. ang. recursion/ pokazuje przyklad na silnie..

C/C++
int silnia( int n )
{
    if( n == 1 )
         return 1;
    else
    {
        return( n *( silnia( n - 1 ) ) );
    }
}

haahaahaahahhahhaha, masz racje.. tak bedzie lepiej :)

//.....

if (n <= 1)

//.........
P-84565
Monika90
» 2013-06-01 20:59:30
A silnia z zera, to jest wg ciebie UB.
P-84581
usmiech
» 2013-06-02 13:39:54
Specjalnie dla Ciebie Monika :)
C/C++
#include "stdafx.h"
#include <iostream>
using namespace std;

template < long long f >
class Silnia
{
public:
    static const long long val =( f * Silnia < f - 1 >::val );
};
template <>
class Silnia < 0 >
{
public:
    static const long long val = 0;
};
template <>
class Silnia < 1 >
{
public:
    static const long long val = 1;
};
int main()
{
    cout << Silnia < 6 >::val << endl;
    system( "pause" );
    return 0;
}
// a moze jednak cus nie do konca oki ;)
P-84630
pekfos
» 2013-06-02 14:10:58
usmiech: Wiesz, że to offtop?
P-84638
usmiech
» 2013-06-02 14:18:34
No tak, ale to jednak nadal jest rekurencja ;)
P-84639
pekfos
» 2013-06-02 14:19:33
I jest, i nie ma. A nawet jeśli, to nie taka, jakiej dotyczy temat.

PS: Monika na pewno doczepi się, że Nie masz sprawdzania, czy podane wartości są poprawne ;)
P-84640
« 1 » 2
  Strona 1 z 2 Następna strona