[C] Procedura ricorsiva

Messaggioda nick_10 » 21/11/2018, 22:30

Buonasera a tutti! Ho molta difficoltà nell'implementare funzioni ricorsive; ho questo esercizio qui:
"Scrivere una procedura ricorsiva C che,
• preso in ingresso un intero positivo k,
• legga da linea di comando (senza memorizzarla) una sequenza di interi positivi che termina quando l’ultimo
valore immesso é zero (l’ultimo numero non fa parte della sequenza), e
• stampi in ordine inverso solo i valori che sono preceduti da un multiplo di k.
Se ad esempio k = 3 e la sequenza `e 4, 8, 12, 11, 6, 13, 9, 15, 5, 0 Allora la stampa deve essere
5, 15, 13, 11, 4"
Io ho provato a scrivere questo:
Codice:
#include <stdio.h>
#define K 3
void sequenzaric(int k){
    int n,m;
    scanf("%d",&n);
    if(n!=0){
        scanf("%d",&m);
        if(n%k==0){
            sequenzaric(k);
            printf("%d",m);
        }
        else n=m;
    }
    else printf("Sequenza invertita: ");
}
int main() {
    sequenzaric(K);
    return 0;
}

Ovviamente il programma non funziona :(
nick_10
Average Member
Average Member
 
Messaggio: 326 di 754
Iscritto il: 17/11/2016, 16:21

Re: [C] Procedura ricorsiva

Messaggioda apatriarca » 22/11/2018, 01:12

Il fatto di scrivere i valori in ordine inverso significa che la struttura della funzione ricorsiva dovrà necessariamente essere:
1. Lettura da linea di comando
2. chiamata ricorsiva
3. stampa del valore

Il principale problema risiede nel fatto che all'interno della funzione è necessario sapere se il valore precedente, quello letto nella funzione chiamante, è un multiplo o meno di \(k\). Non credo sia possibile farlo senza far ricorso ad una seconda funzione. Qualcosa come il seguente dovrebbe funzionare (non l'ho provato):

Codice:
void sequenza_ric(int k, int prev)
{
    int n = 0;

    // Leggi il valore da linea di comando e inizia la stampa inversa se si
    // trova lo zero
    if (scanf("%d", &n) != 1 || n == 0) {
        printf("Sequenza invertita: ");
        return;
    }

    // Chiamata ricorsiva
    sequenza(k, n);

    // Stampa se il valore precedente è un multiplo di k
    if (prev % k == 0) {
        printf("%d", n);
    }
}

void sequenza(int k)
{
    sequenza_ric(k, k);
}
apatriarca
Moderatore
Moderatore
 
Messaggio: 5154 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [C] Procedura ricorsiva

Messaggioda nick_10 » 22/11/2018, 22:50

Ok...però nel passaggio chiamata ricorsiva dovrebbe esserci un sequenza_ric(k,n) e quindi potrei fare a meno anche dell'altra procedura void sequenza
nick_10
Average Member
Average Member
 
Messaggio: 328 di 754
Iscritto il: 17/11/2016, 16:21

Re: [C] Procedura ricorsiva

Messaggioda apatriarca » 23/11/2018, 05:38

Se ti va bene passare due valori quando chiami la funzione allora non hai bisogno della funzione ausiliaria.
apatriarca
Moderatore
Moderatore
 
Messaggio: 5157 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [C] Procedura ricorsiva

Messaggioda nick_10 » 25/11/2018, 11:03

Ho capito. Grazie ;)
nick_10
Average Member
Average Member
 
Messaggio: 331 di 754
Iscritto il: 17/11/2016, 16:21


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite