Problema con le variabili nella ricorsione

J
Jan Rogala (7260 points)
3 4 37
asked Nov 29, 2019 in HW7 opzionale by Jan Rogala (7,260 points)
Ho un problema per quanto riguarda l'HW7opz, quando voglio andare ad aggiungere un qualcosa nell'insieme che mi fara' da risultato, non appena esce dalla chiamata ricorsiva questa viene resettata perche' la dichiaro vuota prima di effettuare i controlli. Solo che se non la dichiaro ovviamente mi da errore. Come posso fare?

3 Answers

Best answer
AndreaGasparini (18730 points)
6 12 118
answered Nov 29, 2019 by AndreaGasparini (18,730 points)
selected Nov 29, 2019 by Jan Rogala
Ti conviene definire l'insieme prima di effettuare la chiamata ricorsiva così da passarlo come parametro della funzione. In questo modo puoi effettuare le modifiche all'interno di ogni chiamata per poi passarlo, ricorsivamente, come parametro a quella successiva.
J
Jan Rogala (7260 points)
3 4 37
commented Nov 29, 2019 by Jan Rogala (7,260 points)
Il problema e' che io non posso passare piu' parametri rispetto alla funzione iniziale, molto probabilmente non ho capito bene cosa intendi
AndreaGasparini (18730 points)
6 12 118
commented Nov 29, 2019 by AndreaGasparini (18,730 points)
Puoi benissimo utilizzare una funzione "di supporto" che effettua la ricorsione piuttosto che fare tutto direttamente in quella principale (se stiamo parlando degli homework), così che potrai inizializzare le variabili che ti servono e poi passarle alla funzione ricorsiva.
Ti faccio un esempio:
 

FUNZIONE_PRINCIPALE():
    ins = set()
    var2 = 1
    FUN2(ins, var2)

FUN2(ins, var2):
    if CASO_BASE:
        return ins
    FUN2(ins.add(var2))
J
Jan Rogala (7260 points)
3 4 37
commented Nov 29, 2019 by Jan Rogala (7,260 points)
Ah ok ho capito, grazie mille
l
leonardoberti (1220 points)
1 4 12
answered Nov 29, 2019 by leonardoberti (1,220 points)
io userei un try, except: non la dichiarare vuota e quando vai per aggiungere qualcosa mettilo nel try, così se ancora non è stata definita ti va nell'except.

non so se mi sono spiegato a parole è difficile
m
matteolazzari (600 points)
0 0 1
commented Dec 1, 2019 by matteolazzari (600 points)
un try,except può aiutare in effetti
E
Edward (25950 points)
2 4 172
answered Nov 29, 2019 by Edward (25,950 points)
Premettendo che la soluzione di Andrea funziona, secondo me è poco elegante nello stile della ricorsione.
Io farei una cosa del genere

Funzione(parametro):
    SE Caso Base:
        restituisco l'insieme {qualcosa dentro}
    Altrimenti
    Variabile RISULTATO = insieme vuoto
    ciclo tra i vari sotto casi:
        RISULTATO = RISULTATO + Funzione(sotto caso) (in questo caso sarebbe un unione tra insiemi, quindi dovresti usare l'operatore |)
    restituisco RISULTATO

questo ovviamente è un esempio generico sull'unione degli insiemi dentro una funzione ricorsiva, poi va adattata al tipo di esercizio.
J
Jan Rogala (7260 points)
3 4 37
commented Nov 29, 2019 by Jan Rogala (7,260 points)
Ho provato a fare una cosa di questo genere, solo che io vado ad aggiungere un qualcosa all'insieme solo in determinati casi, in questo caso quando non ci sono duplicati. In poche parole faccio cosi:

Risultato = set()

ciclo per vedere se ci sono duplicati

     richiamo sulla sottosequenza della sequenza data

non ci sono duplicati:

    aggiungi al risultato

return
E
Edward (25950 points)
2 4 172
commented Nov 29, 2019 by Edward (25,950 points)

Riguardo questo tuo commento:

Il problema e' che io non posso passare piu' parametri rispetto alla funzione iniziale, molto probabilmente non ho capito bene cosa intendi

Sappi che la funzione ricorsiva non deve per forza essere es1, puoi crearne un'altra. L'importante è che è dichiarata al livello più esterno.

Tornando a questo commento invece, hai previsto il caso base? Senza quello la ricorsione non funziona!

J
Jan Rogala (7260 points)
3 4 37
commented Nov 29, 2019 by Jan Rogala (7,260 points)
Oddio, io il caso base non lo attuo pero' mi funziona tutto a dovere. Nel caso dichiarerei come caso base se s = '', ma mi sembra abbastanza inutile
E
Edward (25950 points)
2 4 172
commented Nov 29, 2019 by Edward (25,950 points)
Dipende come hai strutturato la funzione... però generalmente quando si va a creare ad una funzione ricorsiva devi prima pensare al caso base, ossia quando la risposta è immediata. Se non è il caso base allora cerchi di ricondurti al caso base.
Esempio banale con il fattoriale (si assume N > 0):

Funzione fattoriale(N):
    SE N è 0:    (questo sarebbe il caso base)
        restituisco 1
    altrimenti
    restituisco N * fattoriale(N-1)  (questo va a calcolare i sotto casi, che prima o poi si riconducono al caso base)