Problema con l'output della ricorsione

alessio. (2780 points)
1 5 14
asked Dec 12, 2020 in HW8 obbligatorio by alessio. (2,780 points)

Salve a tutti,

Ho impostato il programma in modo molto standard,quindi uso il dizionario che molti stanno usando del tipo:

{ROMAla:[['PARIGI','vendita'],['CAIRO','furto]]...}

Applico anche la ricorsione nel modo più comune:

  • partendo da ROMAla,per ogni sottolista ,aggiorno alla stringa(vuota di default) il segreto del relativo alla sottolista in cui mi trovo;
  • assegno a una lista(anch'essa vuota di default) il valore della chiamata ricorsiva a cui passo la lista degli indizi ridotta e la stringa con il segreto parziale;
  • quando arrivo al caso base(la lista degli indizi ha un solo elemento) completo la stringa e la appendo a un lista,ritorno la lista.
Qunado esco dalla funzione l'output è questo:

[('vendita diamanti rubati stanotte ad  anversa', 'CANCUN'), ('vendita diamanti cannoni mercato nero del  cairo', 'CANCUN'), ('vendita furto di diamanti a buckingham  palace', 'MILANO'), ('vendita furto mata hari ha sedotto ambasciatore  zambia', 'MILANO')]

Qualcuno riesce a spiegarmi perchè?

 

235 views

1 Answer

Best answer
f
fabio.chiarini (2280 points)
0 0 7
answered Dec 12, 2020 by fabio.chiarini (2,280 points)
selected Dec 12, 2020 by alessio.
Prova a dare un'occhiata qui, un altro studente aveva il tuo stesso problema: https://q2a.di.uniroma1.it/20726/aiuto-sulla-ricorsione?course=hw8-required/homeworks/fondamenti-di-programmazione-20-21.

Come ho risposto lì, probabilmente stai aggiornando una variabile che poi passi come argomento nelle varie funzioni ricorsive. Invece di passare la variabile, prova a passare direttamente la stringa dei segreti "aggiornata" nella funzione ricorsiva, dovrebbe risolverti quel problema.
alessio. (2780 points)
1 5 14
commented Dec 12, 2020 by alessio. (2,780 points)
What kind of sorcery is this?

Grazie mille ora funziona....ma perchè?
f
fabio.chiarini (2280 points)
0 0 7
commented Dec 12, 2020 by fabio.chiarini (2,280 points)

Dovrebbe essere perché quando passi la variabile "segreto" contente la stringa in realtà non stai realmente passando la stringa ma solo il suo indirizzo in memoria. Quindi ad ogni ricorsione successiva alla prima (o in cui c'è più di un possibile percorso) stai modificando sempre la stessa identica stringa, solo che non lo vedi. Invece, passando alla funzione direttamente i valori senza salvarli in una variabile il problema non si verifica. Felice di esserti stato d'aiuto  laugh

CiZ (3810 points)
4 12 20
commented Dec 16, 2020 by CiZ (3,810 points)
Salve ragazzi, ho lo stesso problema anche io, io faccio: segreto += nuovo_segretp (che in verità non è una variabile, lo prendo dal mio dizionario)  e poi la variabile segreto la richiamo dalla mia funzione ricorsiva, anche io faccio lo stesso errore? perché ho lo stesso risultato sbagliato
alessio. (2780 points)
1 5 14
commented Dec 16, 2020 by alessio. (2,780 points)
Si è lo stesso errore che facevo io
CiZ (3810 points)
4 12 20
commented Dec 16, 2020 by CiZ (3,810 points)
Ti posso chiedere come hai risolto?
f
fabio.chiarini (2280 points)
0 0 7
commented Dec 16, 2020 by fabio.chiarini (2,280 points)
Devi passare quel segreto direttamente negli argomenti della funzione ricorsiva quando la richiami, senza prima memorizzarli
CiZ (3810 points)
4 12 20
commented Dec 16, 2020 by CiZ (3,810 points)
Ma così come me li concatena? Così non salva i segreti precedenti(?)
f
fabio.chiarini (2280 points)
0 0 7
commented Dec 16, 2020 by fabio.chiarini (2,280 points)
Per come l'ho impostato io, li concateno direttamente nell'argomento quando li passo alla funzione
CiZ (3810 points)
4 12 20
commented Dec 16, 2020 by CiZ (3,810 points)
Ho provato a fare così ma non si può fare funzione(paramentri, segreto + = nuovo_segreto)

Mi sto perdendo qualcosa
f
fabio.chiarini (2280 points)
0 0 7
commented Dec 16, 2020 by fabio.chiarini (2,280 points)
Togli l'uguale
CiZ (3810 points)
4 12 20
commented Dec 16, 2020 by CiZ (3,810 points)
Grazie mille, in questo hw mi sono perso sempre in sciocchezze, grazie tante
f
fabio.chiarini (2280 points)
0 0 7
commented Dec 16, 2020 by fabio.chiarini (2,280 points)
Figurati, di nulla