[C] Procedura ricorsiva
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:
Ovviamente il programma non funziona
"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:
#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

Risposte
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):
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):
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); }
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
Se ti va bene passare due valori quando chiami la funzione allora non hai bisogno della funzione ausiliaria.
Ho capito. Grazie
