[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