Funzioni Ricorsive [C]

C_Ginger
Ciao a tutti, non so come risolvere questo esercizio, qualcuno mi aiuta?

Scrivere una procedura ricorsiva che legga (senza memorizzarla) una sequenza di interi non negativi a0, a1, ..., ai, ..., terminata da −1 e che stampi, in ordine inverso, solo gli ai che sono preceduti da ai−1 tali che ai−1 < ai, escludendo −1. L’ultimo elemento da stampare il primo della sequenza. Se per esempio la sequenza in ingresso fosse: 3 2 8 7 −1 la stampa dovrebbe essere 8 3.


io ho provato così ma non funziona :(

#include<stdio.h>

int ric(int n) {
	if(n>0) {
		scanf("%d", &n);
		if(ric(n-1)<n) {
			printf("%d ", n);
		}
		ric(n);
	}
}


int main() {
	int n;
	ric(n);
} 


Grazie in anticipo :)

Risposte
Sk_Anonymous
Premetto che non programmo in C nè in C++
Ma concettualmente io avrei fatto una funzione ricorsiva che prende un numero in input (il numero precedente della sequenza $a_{i-1}$), chiede l'imput all'utente ($a_i$), verifica che non sia $-1$ (altrimenti ritorna), fa il confronto con $a_{i-1}$ e decide se stampare e poi richiama se stessa con $a_i$ come input.
La incapsulerei poi in un altra funzione non ricorsiva che si occupa di prendere il primo input dall'utente e chiamare quella ricorsiva con l'input preso ed infine, al ritorno dalla ricorsiva, stampa il primo numero

vict85
La descrizione non è molto corretta: non puoi davvero invertire una sequenza senza memorizzarla da qualche parte. Quello che ti sta davvero chiedendo è di memorizzarla nello stack delle chiamate ricorsive.

Per esempio, questo codice inverte una sequenza con una funzione ricorsiva (ma non fa il filtro):
#include <stdio.h>

void
rec( )
{
    int n;
    if ( 1 != scanf( "%d", &n ) )
        return;  // error in reading the number
    if ( n == -1 )
        return;
    rec( );
    printf( "%d ", n );
    return;
}

int
main( void )
{
    rec( );
}

apatriarca
@fab-30: è in effetti più o meno come deve essere implementato.

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