Witamy na forum PC Format Zapraszamy do REJESTRACJI


Użytkownicy przeglądający ten wątek: 1 gości

Niezrozumiały program z książki (funkcja rekurencyjna)

#1
Niezrozumiały program z książki (funkcja rekurencyjna)
Witam.
Kod z książki Grębosza "Symfonia c++ Standard":
Kod:
#include <iostream>

using namespace std;

int sumator(int jeszcze_krokow, int suma_dotychczas);
void dwojkowo(int liczba);
void schodki(int ile, char znak);
//*********************************************************************
int main()
{
   cout << "Ile pierwszych liczb naturalnych "
           "chcesz posumowac?: ";
           int n = 0;
           cin >>n;

           cout << "\nSuma pierwszych " << n
                << " liczb naturalnych to = "
                << sumator(n,0)
                <<endl;
   //----------------------------------------------
   //Zupelnie inny przyklad funkcji rekurencyjnej
   //----------------------------------------------
   int liczba = 241;

   cout << "\n" << liczba << " to dwojkowo ";
   dwojkowo(liczba);
   cout << endl;

   liczba = 30942;
   cout << "\n" << liczba << " to dwojkowo ";
   dwojkowo(liczba);
   cout << endl;
   return 0;
}
//********************************************************************
int sumator(int jeszcze_krokow, int suma_dotychczas)
{
   int rezultat = 0;
   static int krok_rekurencji;
   krok_rekurencji++;

   int to_pietro_nr = krok_rekurencji;
   schodki(to_pietro_nr, '<');

   cout << suma_dotychczas << "+ " << to_pietro_nr
        << " = "
        << (suma_dotychczas + to_pietro_nr)
        << endl;
//wlasciwa operacja sumowania
suma_dotychczas += to_pietro_nr;

//warunek zatrzymujacy rekurencje ++++++++++
if(jeszcze_krokow > 0)
{
//kontynujemy wywloanie rekurencyjne
rezultat = sumator(jeszcze_krokow -1, suma_dotychczas);
}
else
{
//zatrzymujemy
cout << "............to ostatni krok, wracamy .............."
     << endl;
rezultat = suma_dotychczas;
}
//+++++++++++++++++++++++++++++

schodki(to_pietro_nr, '<');
cout << endl;
krok_rekurencji--;
return rezultat;
}
//*******************************************************************
void dwojkowo(int liczba)
{
   int reszta = liczba % 2;
   if(liczba >1)               //warunek zatrzymujacy
   {
       dwojkowo(liczba / 2);   //wywo³anie rekurencyjne
   }
   cout << reszta;
   return;
}
//******************************************************************
void schodki(int ile, char znak)
{
   cout << ile << " pietro: ";
   for(int m = 0; m < ile; m++)
   {
       cout << znak << " ";
   }
   cout << " ";
}
Taki jest efekt:
Kod:
Ile pierwszych liczb naturalnych chcesz posumowac?: 8
1 pietro: <  0+ 1 = 1
2 pietro: < <  1+ 2 = 3
3 pietro: < < <  3+ 3 = 6
4 pietro: < < < <  6+ 4 = 10
5 pietro: < < < < <  10+ 5 = 15
6 pietro: < < < < < <  15+ 6 = 21
7 pietro: < < < < < < <  21+ 7 = 28
8 pietro: < < < < < < < <  28+ 8 = 36
9 pietro: < < < < < < < < <  36+ 9 = 45
............to ostatni krok, wracamy ..............
9 pietro: < < < < < < < < <
8 pietro: < < < < < < < <
7 pietro: < < < < < < <
6 pietro: < < < < < <
5 pietro: < < < < <
4 pietro: < < < <
3 pietro: < < <
2 pietro: < <
1 pietro: <

Suma pierwszych 8 liczb naturalnych to = 45

241 to dwojkowo 11110001

30942 to dwojkowo 111100011011110

I teraz pytanie: Rozumiem do tego momentu "9 pietro: < < < < < < < < <" i według mnie
Kod:
schodki(to_pietro_nr, '<');
cout << endl;
krok_rekurencji--;
return rezultat;
}
Ten fragment to robi(a dokładniej mówiąc funkcja schodki), jednakże według mnie po tym 9 piętrze (według tego co wkleiłem) powinno wrócić do wydruku na ekran tekstu:
Kod:
   cout << suma_dotychczas << "+ " << to_pietro_nr
        << " = "
        << (suma_dotychczas + to_pietro_nr)
        << endl;

Nie rozumiem czemu tak się nie dzieje. Może ktoś rozjaśnić sprawę?
 System operacyjny: windows_seven Przeglądarka: chrome
#2
RE: Niezrozumiały program z książki
Witam, czego dokładnie nie rozumiesz? Czytałeś opis tej funkcji w książce?
Dlaczego wg Ciebie wykonanie funkcji miałoby się cofnąć do tamtej instrukcji? Przecież ta instrukcja się wykonała, czego efektem jest linijka
Kod:
9 pietro: < < < < < < < < <  36+ 9 = 45
Wesoły
 System operacyjny: linux_ubuntu Przeglądarka: firefox
#3
RE: Niezrozumiały program z książki (funkcja rekurencyjna)
Nie ten wydruk cytujesz, o który mi chodzi:
Kod:
9 pietro: < < < < < < < < <
Chodzi mi o powrót już, czyli jak wracamy "<<<" a nie ">>>".
Wyświetla się:
Kod:
............to ostatni krok, wracamy ..............
To rozumiem, bo warunek "if"a tak zadecydował i teraz wychodzimy z ifa i jest dalsza część:
Kod:
schodki(to_pietro_nr, '<');
cout << endl;
krok_rekurencji--;
return rezultat;
Czyli wchodzimy w funkcję schodki i mamy:
Kod:
9 pietro: < < < < < < < < <
I tutaj, nie rozumiem dlaczego dalej jest:
Kod:
8 pietro: < < < < < < < <
itd. Według mnie po 9 jak już wyszliśmy z funkcji schodki to "nie mamy do czego iść" i przechodzimy do momentu, gdzie wchodziliśmy, czyli sądzę, że powinniśmy dostać wynik do tego counta:
Kod:
          cout << "\nSuma pierwszych " << n
               << " liczb naturalnych to = "
               << sumator(n,0)
               <<endl;
 System operacyjny: windows_seven Przeglądarka: chrome
#4
RE: Niezrozumiały program z książki (funkcja rekurencyjna)
Dzieje się tak, bo po zakończeniu wywołania funkcji musi się zakończyć wywołanie poprzedniej funkcji itd.
Kod:
sumator(4, 0):
if (4 > 0)
    sumator (3, 4):
    if (3 > 0)
        sumator(2, 7):
        if (2 > 0)
            sumator(1, 9):
            if (1 > 0)
                sumator(0, 10):
                if (0 > 0) NIE
                
                // koniec wywołania funkcji sumator(0, 10)
            // koniec wywołania funkcji sumator(1, 9)
        // koniec wywołania funkcji sumator(2, 7)
    // koniec wywołania funkcji sumator(3, 4)
// koniec wywołania funkcji sumator(4, 0)
W książce pod tym przykładem jest rysunek, jak wywołania tworzą "stos".
 System operacyjny: linux_ubuntu Przeglądarka: firefox
#5
RE: Niezrozumiały program z książki (funkcja rekurencyjna)
Co prawda trochę mi to zajęło, ale w końcu zrozumiałem!
Dziękuję bardzo!
 System operacyjny: windows_seven Przeglądarka: chrome
Programy: Polecane / Nowe / Inne




Podobne wątki (Niezrozumiały program z książki (funkcja rekurencyjna))
Wątek: Autor Odpowiedzi: Wyświetleń: Ostatni post
  Książki do nauki C# olek23 16 47332 28.08.2020, 09:51
Ostatni post: Ajgor
  Sap i power bi książki Cixi 1 12808 09.02.2018, 21:46
Ostatni post: Cixi
  Książki do administracji baz danych? Cixi 3 10797 26.05.2016, 22:24
Ostatni post: Cixi

Skocz do: