2001 – 9

Dato il vettore

int V[10]={10, 20, 30, 40, 50, 60, 70, 80, 90, 100}

e le seguenti funzioni:

void stampa1(int V[], int k)
{
    for(k=0; k < 10; k++)
        printf("%d ", V[k]);
}
void stampa2(int V[], int k)
{
    if(k == 10) return;
    printf("%d ", V[0]);
    stampa2(&V[1], ++k);
}
void stampa3(int V[], int k)
{
    if(k == 10) return;
    stampa3(&V[1], ++k);
    printf("%d ", V[0]);
}

si supponga che le funzioni siano attivate come stampa1(V, 0), stampa2(V, 0) e stampa3(V, 0) rispettivamente.

Quale o quali delle seguenti affermazioni sono corrette:

  1. tutti e tre le funzioni danno la stessa uscita
  2. stampa1 e stampa2 danno la stessa uscita mentre stampa3 dà una uscita diversa
  3. stampa1 e stampa3 danno la stessa uscita mentre stampa2 dà una uscita diversa
  4. stampa2 e stampa3 danno la stessa uscita mentre stampa1 dà una uscita diversa
  5. la funzione stampa2 e stampa3 sono sbagliate

Soluzione: b (stampa1 e stampa2 danno la stessa uscita mentre stampa3 dà una uscita diversa)


Osserva

  1. stampa1(V, 0): scorre e visualizza gli elementi dal primo all'ultimo.
  2. stampa2(V, 0): k<>10, visualizza il primo elemento (10) e chiama stampa2(&V[1], 1)
    stampa2(&V[1], 1): k<>10, visualizza il primo elemento (20) e chiama stampa2(&V[1], 2)
    ...
    visualizza gli elementi dal primo all'ultimo.
  3. stampa3(V, 0): k<>10, chiama stampa3(&V[1], 1) e poi stampa 10
    stampa3(&V[1], 1): k<>10, chiama stampa3(&V[1],2) e poi stampa 20
    ...
    visualizza gli elementi dall'ultimo al primo.