Differenza tra metodo ricorsivo e iterativo

di il
3 risposte

Differenza tra metodo ricorsivo e iterativo

Non capisco il motivo in termini di efficienza (e non di efficacia perche' penso siano ugluali) di utilizzare un metodo ricorsivo piuttosto di uno iterativo. Per caso si utilizza il metodo ricorsivo per pigrizia? Perche' quest' ultimo puo' arrivare ad occupare un sacco di memoria (ma e' vero anche che puo' essere piu' compatto e comprensibile), mentre il metodo iterativo no.
Grazie in anticipo

3 Risposte

  • Re: Differenza tra metodo ricorsivo e iterativo

    liquidlurker ha scritto:


    Non capisco il motivo in termini di efficienza (e non di efficacia perche' penso siano ugluali) di utilizzare un metodo ricorsivo piuttosto di uno iterativo. Per caso si utilizza il metodo ricorsivo per pigrizia?
    Si usa un metodo ricorsivo quando l'algoritmo da realizzare è tale per cui il passo successivo lo si può realizzare invocando sé stesso. Oppure quando si deve analizzare "qualcosa" di annidato andando potenzialmente "in profondità" (pensa alla scansione in modo ricorsivo delle directory su un file-system).

    liquidlurker ha scritto:


    Perche' quest' ultimo puo' arrivare ad occupare un sacco di memoria (ma e' vero anche che puo' essere piu' compatto e comprensibile), mentre il metodo iterativo no.
    A parte quello che usa in termini di strutture dati specifiche, un metodo ricorsivo consuma memoria sullo stack. Ogni invocazione ricorsiva è un nuovo "stack frame" sullo stack. E lo stack in genere (specialmente in Java, almeno per default) non è così ampio ....
  • Re: Differenza tra metodo ricorsivo e iterativo

    andbin ha scritto:


    liquidlurker ha scritto:


    Non capisco il motivo in termini di efficienza (e non di efficacia perche' penso siano ugluali) di utilizzare un metodo ricorsivo piuttosto di uno iterativo. Per caso si utilizza il metodo ricorsivo per pigrizia?
    Si usa un metodo ricorsivo quando l'algoritmo da realizzare è tale per cui il passo successivo lo si può realizzare invocando sé stesso. Oppure quando si deve analizzare "qualcosa" di annidato andando potenzialmente "in profondità" (pensa alla scansione in modo ricorsivo delle directory su un file-system).

    liquidlurker ha scritto:


    Perche' quest' ultimo puo' arrivare ad occupare un sacco di memoria (ma e' vero anche che puo' essere piu' compatto e comprensibile), mentre il metodo iterativo no.
    A parte quello che usa in termini di strutture dati specifiche, un metodo ricorsivo consuma memoria sullo stack. Ogni invocazione ricorsiva è un nuovo "stack frame" sullo stack. E lo stack in genere (specialmente in Java, almeno per default) non è così ampio ....
    Ah ok. Io avevo supposto il caso in cui il raggiungimento del "caso base" impiegasse moltissime ricorsioni e che quindi la pila si riempie cosi' tanto da scoppiare . Forse ho fatto un ragionamento un po' troppo estremo. Ho pensato che magari il computer si potesse in qualche modo rallentare o bloccarsi.
  • Re: Differenza tra metodo ricorsivo e iterativo

    I problemi di natura ricorsiva, come ad esempio quelli detti da andbin, si possono risolvere in maniera semplice, concisa ed elegante con algoritmi ricorsivi al costo di un maggiore uso memoria. Comunque qualsiasi algoritmo ricorsivo può essere scritto in modo iterativo per ridurne lo spazio usato, solo che in alcuni casi l'algoritmo si complica parecchio e quindi bisogna valutare se conviene di più sprecare un po' di memoria ma avere un algoritmo semplice oppure il contrario.
    Ah ok. Io avevo supposto il caso in cui il raggiungimento del "caso base" impiegasse moltissime ricorsioni e che quindi la pila si riempie cosi' tanto da scoppiare . Forse ho fatto un ragionamento un po' troppo estremo. Ho pensato che magari il computer si potesse in qualche modo rallentare o bloccarsi.
    Molti algoritmi noti anche se sono ricorsivi hanno comunque una complessità spaziale bassa, ovvero il numero di record di attivazione in memoria (numero di chiamate ricorsive) cresce molto poco rispetto al numero degli elementi totali da analizzare (ad esempio se la complessità spaziale è logaritrmica allora se hai 256 elementi, il numero massimo di chiamate ricorsive attive contemporaneamente in un istante di tempo è 8 ). In questi casi lo spazio "extra" in memoria è del tutto trascurabile.

    Il fatto che in alcuni casi la pila potrebbe "scoppiare" è comunque da tenere in considerazione. Alcune certificazioni per software in ambiente critical safe (dove un errore potrebbe portare alla morte di persone o comunque a effetti catastrofici) impongono che non si usi la ricorsione.
Devi accedere o registrarti per scrivere nel forum
3 risposte