Witaj, czy ktoś może wyjaśnić wyjście następującego kodu C++, szczególnie liczby po wyjściu pierwszego 43211223334444

Oto kod:

void rek(int i) { 
if (i > 0){
   cout << i; 
   rek(i-1); 
   for (int k=0; k < i; k++) 
      cout << i; }
}
int main(){
 rek(4);
 return 0;
}

Oto wynik:

the output is: 43211223334444
c++
-3
Marcel6926 18 czerwiec 2021, 13:00

5 odpowiedzi

Najlepsza odpowiedź

Dynamiczny rozwój stosu możemy zapisać ręcznie. Poniżej mam pseudokod z wcięciem cztery na poziom stosu. Polecenia znajdują się po lewej stronie, wynikowe dane wyjściowe w tej kolejności po prawej. Zamieniłem i na odpowiednią liczbę, aby uczynić jeszcze bardziej przejrzystym to, co się dzieje.

rec(4)                                                              
    cout << 4;                                      4
    rec(3)
        cout << 3;                                  3
        rec(2)
            cout << 2;                              2
            rec(1)
                cout << 1;                          1
                rec(0)
                    if(i>0) // fails, rek(0) returns
                rek(1) continues
                for (int k=0; k < 1; k++)
                    cout << 1;                      1
                rek(1) returns
            rek(2) continues
            for (int k=0; k < 2; k++)
                cout << 2;                          2
                cout << 2;                          2
            rek(2) returns
        rek(3) continues
        for (int k=0; k < 3; k++)   
            cout << 3;                              3
            cout << 3;                              3
            cout << 3;                              3
        rek(3) returns
    rek(4) continues
    for (int k=0; k < 4; k++)   
        cout << 4;                                  4
        cout << 4;                                  4
        cout << 4;                                  4
        cout << 4;                                  4
    rek(4) returns
main() continues
return 0;
2
Peter - Reinstate Monica 18 czerwiec 2021, 19:16

Podzielmy łańcuch wyjściowy: „43211223334444” na 2 części:

  1. Część 1: „4321” To jest wynik

    cout << i; 
    rek(i-1); 
    

Drukujesz i i rekursywnie wywołujesz tę samą funkcję, przekazując (i-1) jako argument, a funkcja wykonuje operację till (i > 0). To drukuje liczby od 4 do 1, czyli „4321”

  1. Część 2 „1223334444” To jest wynik sekcji kodu:

    for (int k=0; k < i; k++) 
       cout << i;
    

Ta sekcja jest wywoływana w odwrotnej kolejności od numeru 1 do 4. Ta sekcja kodu zasadniczo wypisuje liczbę i, dla i razy.

For i=1 it prints: 1
For i=2 it prints: 22
For i=3 it prints: 333
For i=4 it prints: 4444

To tworzy ciąg: „1223334444”

Mam nadzieję, że to wyjaśnia całkowity ciąg wyjściowy: "43211223334444"

1
Ashish Khurange 18 czerwiec 2021, 10:11

Wszystkie kłopoty wynikają z faktu, że twoje wyjście nie wprowadziło żadnej separacji w wydrukach wartości cout << i;.

Na początku otrzymujesz następujące informacje:

4, 3, 2, 1 

Wydobyliśmy to z tych dwóch stwierdzeń:

// ...
cout<< i;
rek(i-1);
// ...

Gdzie każde wywołanie rek(i) drukuje swój bieżący i, a następnie wywołuje rek(i-1), który z kolei przed przejściem do treści funkcji musi wydrukować swój i-1, a następnie zadzwoń rek((i-1)-1)... I tak dalej, aż trafi na sprawę i < 0.

Pozostała część jest dostarczana przez wynik 1 jeden raz, 2 dwa razy, 3 trzy razy i 4 cztery razy. Wszystko z powodu pętli for:

for (int k=0; k < i; k++) // print the value of i, i times
      cout << i;

Tak więc zasadniczo masz następujące elementy:

4
3
2
1 // We hit base case on next rek() call, so no print out of there
1 // Here the for loop comes in
2 2
3 3 3  
4 4 4 4

Przy okazji, pamiętaj, że umieszczenie nawiasów klamrowych w kodzie jest nieco sprzeczne z intuicją.

5
rawrex 18 czerwiec 2021, 10:23

Wykonujesz funkcję rekurencyjną, a następnie pętlę for i funkcja zagłębia się w rekurencję, a następnie pętla for działa z najgłębszego punktu rekurencji, dlatego widzisz to wyjście

-1
M7mood1996 18 czerwiec 2021, 10:08

Zaczynasz od zejścia "w dół w drzewie rekurencyjnym", najpierw kończysz drukowanie liczb od i=4 do i=1, a zatem wypisujesz: 4321. Następnie idziesz "w górę drzewa rekursywnego" i zaczynasz drukować od i=1 do i=4 używając pętli, którą napisałeś, dlatego kolejność jest teraz dla i=1, drukujesz 1 i dla i=2 drukujesz 22, co powoduje wydrukowanie 1223334444 na końcu linii.

-1
Udi 18 czerwiec 2021, 10:10