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

Do you need help?

Notice Board

Per partecipare al corso di Fondamenti di programmazione 2023-24 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 2023-24 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.

ricorsione HW8

C
Chiara.Stocchi (510 points)
3 14 17
in HW8 by (510 points)
Non riesco a capire perchè non funziona la ricorsione. La mia funzione fa questo:

def FUNZIONE:

Se il giocatore non ha mosse valide:

        se anche l'altro non ne ha, torna il risultato (sarebbe il caso della partita finita)

        altrimenti richiamo FUNZIONE ma con l'altro giocatore

Se invece il giocatore ha mosse valide:

         per ogni mossa delle mosse valide: (per ogni spazio vuoto possibile):

                     il giocatore fa la mossa

                     definisco la nuova board con la mossa

                     richiamo la FUNZIONE sulla nuova board e il giocatore inverso

Ma una volta che mi torna il primo risultato non funziona più :(

Penso che il problema sia che la funzione, una volta arrivata ad un risultato, non torna indietro a completare i cicli for, avete qualche suggerimento??
244 views

3 Answers

M
Michele13 (1900 points)
7 25 32
by (1.9k points)
provato a fare il debug?
C
Chiara.Stocchi (510 points)
3 14 17
by (510 points)
Si: quando arriva al risultato, torna indietro al ciclo for, però non fa quello che dovrebbe fare: ad esempio le se mosse possibili erano in (0, 0) e in (0, 1):

prima lo fa in (0,0) giustamente e arriva alla fine della partita, ma quando torna indietro per farlo con (0,1) la board rimane quella finale e non torna a quella corretta. Non so se si è capito :)
M
Michele13 (1900 points)
7 25 32
by (1.9k points)
prova a tenerti una immagine pulita della board iniziale e una volta finiti i movimenti che modificano distruttivamente un'altra board (quella su cui fai i vari movimenti) fai:

boardConModifiche = boardIniziale

non so se è la risposta che cercavi...
L
Larenzz03 (5990 points)
3 14 65
by (6.0k points)
Non so se l'hai fatto, può essere dovuto al fatto che modifichi la board in modo irreversibile durante l'esecuzione della funzione, quindi può essere difficile tornare indietro e ricominciare la ricorsione con una nuova mossa. In questo caso, potresti fare una copia della board per ogni chiamata ricorsiva, in modo da avere sempre a disposizione una versione "pulita" della board su cui lavorare.

Quindi crei una nuova lista vuota(che rapresenta la uova scacchiera), fai un for in cui scrivi poi lista(nuova scacchiera).append(lista.copy())
R
RoccoF (620 points)
1 2 5
by (620 points)
io avevo un problema simile, sostanzialmente mi faceva la ricorsione ma una volta ottenuta la prima "foglia" tornava direttamente alla radice senza fare le altre ramificazioni; in altre parole facevo solo il lato tutto a sinistra dell'albero.

Il mio errore era che facevo direttamente return funzioneRicorsiva.

Ho risolto salvando i result della funzioneRicorsiva in una lista e ritornando la lista stessa. Non so se può essere di aiuto
m
mecostagliola (2480 points)
2 4 18
by (2.5k points)
ho risolto anche io lo stesso problema aggiungendo il return sulla funzione ricorsiva