Stampa triangolo ricorsivo

di il
15 risposte

Stampa triangolo ricorsivo

Salve ragazzi avevo intenzione di fare una stampa di un triangolo in maniera ricorsiva per ottenere il seguente output
*
**
***
****
*****

il problema è che non riesco ad individuare le condizioni necessarie per fermarmi ho buttato giù qualche riga di codice che in maniera ricorsiva da il seguente output
******
****
***
**
*
quindi l'esatto contrario vi posto il codice se qualcuno ha sugerimenti saranno ben graditi



int stampa_ricorsivo(int x){
    int i;

    for(i=0;i<=x;i++)
        printf("*");
        printf("\n");
    if(x==0)
        return(0);

    else stampa_ricorsivo(x-1);
    return 1;// scritto solamente per non far attivare il segnale di pericolo 
}

15 Risposte

  • Re: Stampa triangolo ricorsivo

    Ci sono riuscito però credo che esistano soluzioni ben più ottimizzate vi posto il codice commentato così se qualcuno ha 1 idea può intervenire
    
    
    
    int stampa_ricorsivo(int num,int n){//inizialmente num e n contengono lo stesso valore
        int i=0,j;
        static int a=0;  // creazione di una variabile statica per capire quante volte deve fare il ciclo
        
            for(i=0;i<a;i++)// la prima volta stampa *  e va sotto poi stampa ** e così via
                printf("*");
        printf("\n");
        if(a==n)return 0;// condizione di arresto quando la variabile ha ragiunto  il numero di volte prefissato
                           //dall'utente
        j=stampa_ricorsivo(a=a+1,n);  //  chiamata ricorsiva
        return(1);// non verrà mai eseguito è solo per non far andare in allarme il mio compilatore
    }
    
    
    
    

    credo esista qualcosa di più ottimizzato che mi risparmi la variabile statica e di passare 2 volte lo stesso valore nella prima chiamata al sottoprogramma voi cosa ne pensate?
  • Re: Stampa triangolo ricorsivo

    Ciao broke31

    Una soluzione alternativa è quella di usare due funzioni in questo modo:
    
    void stampa_ricorsivo(int max, int x)
    {
        for(int i = 0; i < x; i++)
            printf("*");
        
        printf("\n");
        if(x < max)
            stampa_ricorsivo(max, x + 1);
    }
    
    void stampa_triangolo(int x)
    {
        if (x > 0)
            stampa_ricorsivo(x, 1);
    }
    
    int main()
    {
       stampa_triangolo(5);
    }
    
  • Re: Stampa triangolo ricorsivo

    Secondo me è meglio la versione precedente dove stampa_ricorsivo viene messa in testa.
    In pratica devi ottenere una situazione inversa, in quanto nello stack te le trovi contrarie (esempio per n=5: 5,4,3,2,1 -> 1,2,3,4,5). Una cosa tipo:
    . parti da [x]=[n]
    . se [x>0] esegui stampa_ricorsivo([x]-1) e successivamente stampi '*' [x] volte
    . fine
  • Re: Stampa triangolo ricorsivo

    Non funziona e non credo che come output ci sarebbe
    *
    **
    ***
    ****
  • Re: Stampa triangolo ricorsivo

    Io ti dico che funziona, però non ti voglio togliere il gusto di fartelo fare
  • Re: Stampa triangolo ricorsivo

    No sorry la risposta era per barba59 grazie per il consiglio e ti ringrazio anche del fatto che non hai messo il codice... è molto più soddisfacente farlo da solo
  • Re: Stampa triangolo ricorsivo

    In effetti non avevo letto il post di barba.
    ciao barba
  • Re: Stampa triangolo ricorsivo

    Ciao ixamit

    broke31 ha scritto:


    non funziona e non credo che come output ci sarebbe
    *
    **
    ***
    ****
    Ohibo! Prima di mandartela l' ho provata, si compila e stampa il triangolo, che problemi ti da?

    EDIT, mi sono accorto che ho dimenticato il return 0 nel main, era questo che intendevi?

    EDIT2, e comunque la soluzione migliore è quella proposta da ixamit.
  • Re: Stampa triangolo ricorsivo

    Hai ragione barba funziona ma postresti commentare perchè non mi è tanto chiaro sorry
  • Re: Stampa triangolo ricorsivo

    No, no sono io che devo dire sorry, la soluzione che ti ho postato pur funzionando non è quella giusta (sai non sempre si è lucidi ) segui le indicazioni di ixamit e vedrai che risolvi il tutto in maniera elegante e con pochissime righe di codice.
    Se poi serve una mano chiedi pure.
  • Re: Stampa triangolo ricorsivo

    Ho provato come ha detto iaxmit ma l'output è sempre al contrario
    ****
    **
    *
    per capirci ... vi posto il codice
    
    
    int main()
    {
        int a=5;
        a=maggiore(a);
        stampa_triangolo_ricorsivo(a);
    
        return 0;
    }
    
    
    
    
    void stampa_triangolo_ricorsivo(int num)
    
    {   
        int i=0;
        for(i=0;i<num;i++)
            printf("*");
        printf("\n");
        i=maggiore(num);
    
    
    
    
    
    
    }
    
    
    int maggiore (int x){
    if(x>0)
        stampa_triangolo_ricorsivo(x-1);
    else return(-1);
    
    
    
    }
    
    
    
    
  • Re: Stampa triangolo ricorsivo

    ixamit ha scritto:


    Secondo me è meglio la versione precedente dove stampa_ricorsivo viene messa in testa.
    In pratica devi ottenere una situazione inversa, in quanto nello stack te le trovi contrarie (esempio per n=5: 5,4,3,2,1 -> 1,2,3,4,5). Una cosa tipo:
    . parti da [x]=[n]
    . se [x>0] esegui stampa_ricorsivo([x]-1) e successivamente stampi '*' [x] volte
    . fine
    Mi sembra chiaro.
    http://ixam.it/post.php?link=bash-shell-recursive-function
  • Re: Stampa triangolo ricorsivo

    L'ho fatto ...funziona non mi è chiaro solo 1 passaggio
    
    
    
    
    
    #include <stdio.h>
    void triangolo(int);
    
    
    
    int main(int argc, const char * argv[])
    {
        int numero;
        printf("inserisci il numero delle righe\n");
        scanf("%d",&numero);
        triangolo(numero);
        return 0;
    }
    
    
    
    
    void triangolo(int num){
        int i;
        if(num>0){
           triangolo(num-1);// chiamata ricorsiva es num vale 5 si richiama e vale 4 si richiama e vale 3                                                                  for(i=0;i<num;i++)      // come fa quindi questo for a partire se la condizione è maggiore e lui la decrementa sempre fino a 0?
                printf("*");
            printf("\n");
        }
        
        }
    
  • Re: Stampa triangolo ricorsivo

    Quando chiami la funzione 'triangolo' passi il parametro per valore non per riferimento, questo vuol dire che la funzione chiamata puo modificare a piacere il parametro senza che questo abbia effetto sulla variabile nella funzione chiamante.

    Il fatto che la funzione chiamata e quella chiamante siano entrambe la funzione 'triangolo' non cambia niente, ognuna ha il suo stack e le sue variabili locali.
    
    void triangolo(int num){
        if(num > 0)
        {
            // se qui ad esempio num vale 5
            triangolo(num - 1);
    	   
            // anche dopo la chiamata num continua a valere 5 
            for(int i=0; i<num; i++)     
                printf("*");
           
            printf("\n");
        }
    }
    
    Per cui prima vengono chiamate le funzioni più annidate, poi si risale lo stack delle chiamate, vengono ristabiliti i valori delle variabili locali ed effettuate le stampe e il tutto funziona magicamente. Le prime volte questo meccanismo può disorientare, riflettici un poco.
Devi accedere o registrarti per scrivere nel forum
15 risposte