Clasa a X-a · RecursivitateRead in English

Afișarea cifrelor în ordine, recursiv în C++

În engleză: Printing the digits in order, recursively

O(n)C++1746 de linii1 exemplu

Ideea

Contează unde punem afișarea față de autoapel. În inOrdine afișăm DUPĂ autoapel: întâi se termină apelul pentru n / 10 (care afișează cifrele din față), abia apoi afișăm ultima cifră, deci cifrele ies de la stânga la dreapta. În invers afișăm ÎNAINTE de autoapel, deci ultima cifră apare prima. Fără niciun vector, stiva de apeluri „ține minte” cifrele pentru noi.

Descrierea în engleză

Where we print relative to the recursive call matters. In inOrdine we print AFTER the recursive call: first the call for n / 10 finishes (printing the leading digits), and only then do we print the last digit, so the digits come out from left to right. In invers we print BEFORE the recursive call, so the last digit appears first. With no array at all, the call stack 'remembers' the digits for us.

Complexitate
O(k), unde k este numărul de cifre
Clasa
Clasa a X-a (Grade 10)

Exemple

Exemplul 1

Intrare

4096

Ieșire așteptată

4 0 9 6
6 9 0 4

Codul C++

Codul complet, cu comentarii în română. Îl poți modifica liber și îl poți reseta oricând.

afisarea-cifrelor-in-ordine.cpp
/*
 * Titlu: Afișarea cifrelor în ordine, recursiv
 * Clasa: 10
 * Capitol: Recursivitate
 * Descriere: Contează unde punem afișarea față de autoapel. În inOrdine afișăm
 *            DUPĂ autoapel: întâi se termină apelul pentru n / 10 (care afișează
 *            cifrele din față), abia apoi afișăm ultima cifră, deci cifrele ies de
 *            la stânga la dreapta. În invers afișăm ÎNAINTE de autoapel, deci ultima
 *            cifră apare prima. Fără niciun vector, stiva de apeluri „ține minte”
 *            cifrele pentru noi.
 * Complexitate: O(k), unde k este numărul de cifre
 *
 * Exemplu
 * Intrare: 4096
 * Ieșire:
 * 4 0 9 6
 * 6 9 0 4
 */
#include <iostream>
using namespace std;

void inOrdine(int n)
{
    if (n > 9)
        inOrdine(n / 10);
    cout << n % 10 << ' ';     // după autoapel
}

void invers(int n)
{
    cout << n % 10 << ' ';     // înainte de autoapel
    if (n > 9)
        invers(n / 10);
}

int main()
{
    int n;
    cin >> n;
    inOrdine(n);
    cout << '\n';
    invers(n);
    cout << '\n';
    return 0;
}

Rulează pe un g++ adevărat (C++17, -O2) prin Compiler Explorer. Programele trebuie să se termine repede: există o limită de timp.