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. #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; } |
|
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(). |
|
usmiech |
» 2013-06-01 18:53:19 Chyba najlepiej rekurencje /albo rekursje.. ang. recursion/ pokazuje przyklad na silnie.. int silnia( int n ) { if( n == 1 ) return 1; else { return( n *( silnia( n - 1 ) ) ); } } haahaahaahahhahhaha, masz racje.. tak bedzie lepiej :) //..... if (n <= 1) //......... |
|
Monika90 |
» 2013-06-01 20:59:30 A silnia z zera, to jest wg ciebie UB. |
|
usmiech |
» 2013-06-02 13:39:54 Specjalnie dla Ciebie Monika :) #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; }
|
|
pekfos |
» 2013-06-02 14:10:58 usmiech: Wiesz, że to offtop? |
|
usmiech |
» 2013-06-02 14:18:34 No tak, ale to jednak nadal jest rekurencja ;) |
|
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 ;) |
|
« 1 » 2 |