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

Do you need help?

HW7 - Una mano angelica per illuminare il mio cammino?

ale70029 (1950 points)
7 14 28
in HW7 opzionale by (2.0k points)
reshown by

Allora.. visto che non posso condividere il codice vi spiego il mio ragionamento nella speranza che qualcuno illumini il mio cammino.

Per prima cosa ho creato una funzione ausiliaria per trovare tutte le coppie di caratteri (o meglio gli indici)

    # Per  ['1','2','0','1','0','0','1'] mi da [[0, 3], [0, 6], [2, 4], [2, 5], [3, 6], [4, 5]] ovvero la lista di tutti gli indici di coppie uguali di caratteri

Poi ho creato un altra funzione ausiliaria, che data una lista ed una lista di indici, ritorna la lista senza i caratteri in quegli indici

    # esempio(['1','2','3','4','5'],[2,4]) = ['1','2','4']

Poi ho scritto la funzione ex1 ricorsiva..

Per prima cosa se s è una stringa la trasformo in una lista facendo uno split sugli spazi (così evito di controllare le coppie di spazi e ho elementi 'puliti' nel caso in cui nei test ci siano numeri di due cifre)

Poi creo un set vuoto

Poi calcolo le coppie con la funzione di prima e le metto in una variabile

Poi controllo che questa variabile delle coppie sia uguale ad una lista vuota (in questo caso vuol dire che sono in una foglia perchè la mia funzione non ha trovato coppie)... nel caso ritorno la lista s riconvertita in stringa (' '.join(s))

Altrimenti se ci sono coppie vuol dire che sono in un nodo, quindi faccio un ciclo sulle coppie, e per ogni coppia, riuso la funzione ex1 ricorsivamente sulla stringa ottenuta eliminando quella coppia dalla stringa, e salvo il risultato in una variabile X

Se x non è un set lo aggiungo al set che ho creato prima, e poi fuori dal ciclo ritorno questo set

Il mio imputtanamento è da queste parti, perchè a volte x è una foglia, a volte x è il set che dovrei ritornare alla fine, perchè giustamente dipende dal if all'inizio quale return verrà utilizzato, a me servirebbe un illuminazione per capire come gestire questo set che mi sembra venga sovrascritto..per spiegarmi meglio allego il log della console dove uso rtrace e ci piazzo una stampa della x in mezzo ( e in fondo invece trovate tutte le x in successione)

Come potete notare esiste un momento nello spaziotempo in cui il mio set esiste e contiene ciò che deve contenere, ma alla fine per me c'è solo un triste set vuoto.

E' da un po che ci provo ma sto perdendo lentamente la mia sanità mentale quindi sarebbe molto gradita una mano che faccia luce sull'errore che sto ignorando. Grazie

------------------- Starting recursion -------------------
 entering    ex1('1 2 0 1 0 0 1',)
|-- entering    ex1(['2', '0', '0', '0', '1'],)
|--|-- entering    ex1(['2', '0', '1'],)
|--|-- exiting     ex1(['2', '0', '1'],)    returns    2 0 1
x= 2 0 1
|--|-- entering    ex1(['2', '0', '1'],)
|--|-- exiting     ex1(['2', '0', '1'],)    returns    2 0 1
x= 2 0 1
|--|-- entering    ex1(['2', '0', '1'],)
|--|-- exiting     ex1(['2', '0', '1'],)    returns    2 0 1
x= 2 0 1
|-- exiting     ex1(['2', '0', '0', '0', '1'],)    returns    {'2 0 1'}
x= {'2 0 1'}
|-- entering    ex1(['2', '0', '1', '0', '0'],)
|--|-- entering    ex1(['2', '1', '0'],)
|--|-- exiting     ex1(['2', '1', '0'],)    returns    2 1 0
x= 2 1 0
|--|-- entering    ex1(['2', '1', '0'],)
|--|-- exiting     ex1(['2', '1', '0'],)    returns    2 1 0
x= 2 1 0
|--|-- entering    ex1(['2', '0', '1'],)
|--|-- exiting     ex1(['2', '0', '1'],)    returns    2 0 1
x= 2 0 1
|-- exiting     ex1(['2', '0', '1', '0', '0'],)    returns    {'2 1 0', '2 0 1'}
x= {'2 1 0', '2 0 1'}
|-- entering    ex1(['1', '2', '1', '0', '1'],)
|--|-- entering    ex1(['2', '0', '1'],)
|--|-- exiting     ex1(['2', '0', '1'],)    returns    2 0 1
x= 2 0 1
|--|-- entering    ex1(['2', '1', '0'],)
|--|-- exiting     ex1(['2', '1', '0'],)    returns    2 1 0
x= 2 1 0
|--|-- entering    ex1(['1', '2', '0'],)
|--|-- exiting     ex1(['1', '2', '0'],)    returns    1 2 0
x= 1 2 0
|-- exiting     ex1(['1', '2', '1', '0', '1'],)    returns    {'2 1 0', '2 0 1', '1 2 0'}
x= {'2 1 0', '2 0 1', '1 2 0'}
|-- entering    ex1(['1', '2', '1', '0', '1'],)
|--|-- entering    ex1(['2', '0', '1'],)
|--|-- exiting     ex1(['2', '0', '1'],)    returns    2 0 1
x= 2 0 1
|--|-- entering    ex1(['2', '1', '0'],)
|--|-- exiting     ex1(['2', '1', '0'],)    returns    2 1 0
x= 2 1 0
|--|-- entering    ex1(['1', '2', '0'],)
|--|-- exiting     ex1(['1', '2', '0'],)    returns    1 2 0
x= 1 2 0
|-- exiting     ex1(['1', '2', '1', '0', '1'],)    returns    {'2 1 0', '2 0 1', '1 2 0'}
x= {'2 1 0', '2 0 1', '1 2 0'}
|-- entering    ex1(['1', '2', '0', '0', '0'],)
|--|-- entering    ex1(['1', '2', '0'],)
|--|-- exiting     ex1(['1', '2', '0'],)    returns    1 2 0
x= 1 2 0
|--|-- entering    ex1(['1', '2', '0'],)
|--|-- exiting     ex1(['1', '2', '0'],)    returns    1 2 0
x= 1 2 0
|--|-- entering    ex1(['1', '2', '0'],)
|--|-- exiting     ex1(['1', '2', '0'],)    returns    1 2 0
x= 1 2 0
|-- exiting     ex1(['1', '2', '0', '0', '0'],)    returns    {'1 2 0'}
x= {'1 2 0'}
|-- entering    ex1(['1', '2', '0', '1', '1'],)
|--|-- entering    ex1(['2', '0', '1'],)
|--|-- exiting     ex1(['2', '0', '1'],)    returns    2 0 1
x= 2 0 1
|--|-- entering    ex1(['2', '0', '1'],)
|--|-- exiting     ex1(['2', '0', '1'],)    returns    2 0 1
x= 2 0 1
|--|-- entering    ex1(['1', '2', '0'],)
|--|-- exiting     ex1(['1', '2', '0'],)    returns    1 2 0
x= 1 2 0
|-- exiting     ex1(['1', '2', '0', '1', '1'],)    returns    {'2 0 1', '1 2 0'}
x= {'2 0 1', '1 2 0'}
 exiting     ex1('1 2 0 1 0 0 1',)    returns    set()
-------------------- Ending recursion --------------------
Num calls: 25
set()
x= 2 0 1
x= 2 0 1
x= 2 0 1
x= {'2 0 1'}
x= 2 1 0
x= 2 1 0
x= 2 0 1
x= {'2 1 0', '2 0 1'}
x= 2 0 1
x= 2 1 0
x= 1 2 0
x= {'2 1 0', '2 0 1', '1 2 0'}
x= 2 0 1
x= 2 1 0
x= 1 2 0
x= {'2 1 0', '2 0 1', '1 2 0'}
x= 1 2 0
x= 1 2 0
x= 1 2 0
x= {'1 2 0'}
x= 2 0 1
x= 2 0 1
x= 1 2 0
x= {'2 0 1', '1 2 0'}
set()

2 Answers

mirko1010 (5560 points)
13 33 60
by (5.6k points)
edited by
Buonasera, La funzione ricorsiva non deve essere ex1 ma un altra esterna come scritto in traccia ,   credo che hai avuto una  idea coraggiosa  a questo punto dovresti  chiamare la funzione ricorsiva passandogli la lista originale   , e la lista di sottoliste indici  ma in combinazioni  , elimini ricorsivamente tutte le coppie a ogni chiamata , passandogli una combinazione diversa ( nel tuo esempio ne hai 6 coppie quindi 6 posizioni e  6 possibiltà per ognuna pos  quindi 6^6 comb) ogni exting ric ti aggiungerà al ritorno una lista pronta , il caso base potrebbe essere appunto il numero di disposizione  con ripetizione che saprai prima in len  .  Servirà anche qualcosa che si accerti che la coppia di indici  esiste . Il costo è abbastanza  enorme( numero coppie ^ n ) + tutto il resto   , ma osserva che se il numero degli elementi di conteggio dispari è 1 o 2  ha già quello che vuoi in set , così come vale la pena eliminare tutti i numeri che hanno conteggio pari fin da subito  perché in ogni caso saranno eliminatj tutti . Per la tua strada molto simile ma otterrai anche i rami e non solo le foglie come hai riscontrato , osserva che la lunghezza delle foglie è sempre uguale nel tuo esempio hanno len == 3 , ora se ci fai caso devi verificare che la lunghezza di ogni tua lista ottenuta deve essere uguale alla lunghezza del set  lista originale in differenza con gli  un set di elementi di conteggio pari  ad esempio : 112234 ha len 4 in set meno lunghezza del set dei numeri conteggio pari quindi  4-2 == len{3,4}. ==2 spero di essere stato di  illuminazione :)
ale70029 (1950 points)
7 14 28
by (2.0k points)
Si per gli ultimi 3 test scatta il timeout, proverò ad adottare i tuoi consigli per velocizzare il tutto, grazie!
FlavioFantasia (870 points)
2 7 13
by (870 points)
Prova a passargli il set tramite variabile di input nella chiamata ricorsiva. In questo modo a fine ricorsione non viene "pulito" il set e ottieni il risultato finale.
ale70029 (1950 points)
7 14 28
by (2.0k points)
Ha funzionato, grazie!
FlavioFantasia (870 points)
2 7 13
by (870 points)
edited by
Perfetto, di nulla!