[C] Esercizio funzione ricorsiva

nick_10
Ciao! Sono sempre alle prese con esercizi sulle funzioni ricorsive...questa volta il testo mi chiede:
"Scrivere in C una funzione RICORSIVA che
• legga da linea di comando (senza memorizzarla) una sequenza di interi positivi che termina appena entra 0 e che
• restituisca il numero di interi che sono preceduti da un elemento di valore triplo.
Ad esempio, se la sequenza fosse 3 7 2 6 2 9 2 8 7 36 12 4 0, la funzione dovrebbe restituire 3."

Io sono riuscito a farlo nel modo che riporto qui sotto. Volevo sapere se secondo voi può andar bene.
In esercizi di questo genere sulla ricorsione, il mio problema è capire come inserire un "passo base" e poi il richiamo della funzione stessa.
In questo esercizio ci son riuscito solo leggendo il primo numero della sequenza dal main e passarlo poi alla funzione...magari c'è un modo per scrivere il programma con una funzione dal prototipo "int funzione()" e leggere tutti i numeri della sequenza nella funzione stessa. Non so se mi son spiegato bene :roll:

#include <stdio.h>
int funzione(int n){
    int m;
    if(n==0) return 0;
    else{
        scanf("%d",&m);
        if(n!=m*3){
            return funzione(m);
        }
        else return 1+funzione(m);
    }
}
int main() {
    int n;
    scanf("%d",&n);
    printf("Il numero di interi è:%d\n",funzione(n));
    return 0;
}

Risposte
apatriarca
Il problema è lo stesso dell'altra discussione. E' in qualche modo necessario passare il valore precedente alla funzione, normalmente facendo uso di una funzione ausiliaria. In questo caso avresti quindi una funzione che legge il primo valore e poi restituisce il risultato della chiamata ricorsiva della funzione che hai scritto.

nick_10
Invece di usare un'altra funzione ausiliaria, è sbagliato farlo dal main come ho fatto io?

apatriarca
Se lo fai nel main non c'è modo di riutilizzare la tua funzione nella sua completa funzionalità senza leggere il valore ogni volta.

nick_10
Grazie mille ;)

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.