Please ignore secret bonuses. Secret tests do NOT award bonus. Max hw grade is 30+2 bonus efficiency

Do you need help?

Funzioni ricorsive: utilizzo di 'return'.

s
sam_dc (680 points)
4 6 7
in Programmare in Python by (680 points)

Ho dei dubbi riguardo l'utilizzo del return nelle funzioni ricorsive. 
Da quanto ho capito basta ritornare 'None' oppure scrivere semplicemente 'return' per fare in modo che si esca da una funzione ricorsiva, ma in questo caso non mi è chiaro come procedere.

Sembra che il programma provi a sommare 'None' all'elemento L[i], invece di uscire dalla funzione ricorsiva.
Dove sbaglio?

def esempioR(L, i=0):
    if i == len(L):
        return 0
    if condizione1:
        return None #oppure return 
    if condizione3:
        return L[i] + esempioR(L, i+1)


1.1k views

2 Answers

E
Edward (25950 points)
3 4 172
by (26.0k points)

Facendo return None, esci da quella chiamata ricorsiva, e ritorni nella funzione che l'ha chiamata.

return L[i] + esempioR(L, i+1)

È normale che ti da errore, dato che stai cercando di sommargli esempioR(L, i+1), che se si verifica condizione1 ritorna None

s
sam_dc (680 points)
4 6 7
by (680 points)

'Facendo return None, esci da quella chiamata ricorsiva, e ritorni nella funzione che l'ha chiamata.'

È possibile uscire proprio dalla funzione (intendo tutte le chiamate fatte fino a quel punto) invece di uscire soltanto da quella chiamata in particolare e tornare nella funzione che l'ha chiamata? 

E
Edward (25950 points)
3 4 172
by (26.0k points)
No, con la ricorsione non puoi farlo.

Puoi farlo con l'iterazione facendo appunto un return. Ma con la ricorsione no.

Quello che puoi fare è controllare che il valore non sia None prima di sommarlo, oppure usare lo 0 per i numeri, o la stringa vuota '' per le stringhe (che sono neutri nella somma/concatenazione)
a
a.pietroluongo (11250 points)
20 39 131
by (11.3k points)
edited by

Un modo sarebbe con le eccezioni

E
Edward (25950 points)
3 4 172
by (26.0k points)
Le eccezioni non escono dalla funzione ricorsiva.
Semplicemente se è molto in profondità nella ricorsione genererebbe un casino di eccezioni inutili, che vanno gestite, e fanno perdere tempo
a
a.pietroluongo (11250 points)
20 39 131
by (11.3k points)
Puoi uscire con sys.exit(0)
E
Edward (25950 points)
3 4 172
by (26.0k points)
edited by
??? sys.exit genera un'eccezione quindi avresti lo stesso problema

EDIT: Volendo sì, potrebbe generare un eccezione e gestirla dove chiama la funzione ricorsiva la prima volta, ma non so se per l'homework8 sia l'ideale, visto che se generi l'eccezione per uscire dal percorso a destra, potrebbe esserci nel percorso in basso. Poi ovviamente dipende da come uno costruisce la funzione.
a
a.pietroluongo (11250 points)
20 39 131
by (11.3k points)
Se fai
return risultato
sys.exit(0)

Ti esce dalla ricorsione e  ritorna il risultato
a
a.pietroluongo (11250 points)
20 39 131
by (11.3k points)
Dicevo in generale.Per homework no perché devi importare sys
andrea.sterbini (207920 points)
750 1267 2373
by (208k points)
La funzione deve tornare un valore numerico

Usare return da solo oppure return None darà un errore