| 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ę, żeNie masz sprawdzania, czy podane wartości są poprawne ;) | 
|  | 
| « 1 »  2 |