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

Do you need help?

Problema con le variabili nella ricorsione

J
Jan Rogala (7260 points)
4 4 37
in HW7 opzionale by (7.3k 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?
603 views
closed

3 Answers

Best answer
AndreaGasparini (18850 points)
7 12 120
by (18.9k points)
selected by
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)
4 4 37
by (7.3k points)
Il problema e' che io non posso passare piu' parametri rispetto alla funzione iniziale, molto probabilmente non ho capito bene cosa intendi
AndreaGasparini (18850 points)
7 12 120
by (18.9k 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)
4 4 37
by (7.3k points)
Ah ok ho capito, grazie mille
l
leonardoberti (1220 points)
2 4 12
by (1.2k 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
by (600 points)
un try,except può aiutare in effetti
E
Edward (25950 points)
3 4 172
by (26.0k 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)
4 4 37
by (7.3k 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)
3 4 172
by (26.0k 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)
4 4 37
by (7.3k 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)
3 4 172
by (26.0k 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)