Do you need help?

Notice Board

Per partecipare al corso di Fondamenti di programmazione 2021-22 loggatevi e attivatelo nella vostra pagina dei corsi preferiti. A quel punto il corso appare nel menù personale cliccando sul proprio avatar. Per i materiali degli anni precedenti seguite lo stesso metodo.

To join the Programming/Lab 2021-22 course, log-on and select it on the my courses page. It will appear on the personal menu of your avatar. For earlier years use the same method.

VIDEOLEZIONI DEL CORSO DI FONDAMENTI DI PROGRAMMAZIONE AA20-21

PROGRAMMING COURSE VIDEOCONFERENCES AY20-21

Problema con l'output della ricorsione

alessio. (2780 points)
1 5 14
in HW8 obbligatorio by (2.8k 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è?

 

236 views
closed

1 Answer

Best answer
f
fabio.chiarini (2280 points)
0 0 7
by (2.3k points)
selected by
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
by (2.8k points)
What kind of sorcery is this?

Grazie mille ora funziona....ma perchè?
f
fabio.chiarini (2280 points)
0 0 7
by (2.3k 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
by (3.8k 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
by (2.8k points)
Si è lo stesso errore che facevo io
CiZ (3810 points)
4 12 20
by (3.8k points)
Ti posso chiedere come hai risolto?
f
fabio.chiarini (2280 points)
0 0 7
by (2.3k points)
Devi passare quel segreto direttamente negli argomenti della funzione ricorsiva quando la richiami, senza prima memorizzarli
CiZ (3810 points)
4 12 20
by (3.8k points)
Ma così come me li concatena? Così non salva i segreti precedenti(?)
f
fabio.chiarini (2280 points)
0 0 7
by (2.3k points)
Per come l'ho impostato io, li concateno direttamente nell'argomento quando li passo alla funzione
CiZ (3810 points)
4 12 20
by (3.8k 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
by (2.3k points)
Togli l'uguale
CiZ (3810 points)
4 12 20
by (3.8k points)
Grazie mille, in questo hw mi sono perso sempre in sciocchezze, grazie tante
f
fabio.chiarini (2280 points)
0 0 7
by (2.3k points)
Figurati, di nulla