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

Do you need help?

problema quando scorro nella matrice

s
simone.lioy (1420 points)
28 30 39
in HW8 obbligatorio by (1.4k points)
ho un problema quando controllo la matrice e con l'if controllo allo stesso tempo se c'è una parola a destra, il problema si pone quando controllo la lista delle parole e siccome la lista delle parole è più grande di altezza rispetto la matrice, infatti mi va in out of range. un altro problema anzi un consiglio mica mi potete dare una mano nella ricorsione?
702 views

3 Answers

a
a.pietroluongo (11250 points)
20 39 131
by (11.3k points)
edited by

prova a controllare se le coordinate sono dentro la matrice cioè confronta gli indici di riga  e colonna: altezza len(matrice) e larghezza len(matrice[0])

s
simone.lioy (1420 points)
28 30 39
by (1.4k points)
larghezza e altezza sono impostati perfettamente, per farmi capire meglio, la parola enrico sta nella lista delle parole alla quinta riga mentre la matrice arriva a quattro righe
s
simone.lioy (1420 points)
28 30 39
by (1.4k points)
con due for annidati leggo la matrice un in range dell'altezza mentre l'altro in range della larghezza, poi ho fatto un altro for che mi legge solo le righe della lista altrimenti la parola enrico non mi viene letta, e questo for mi serve per non andare out of range quando scorro per colonne siccome le colonne della matrice sono maggiori delle colonne della lista di parole (in alcune parole) ho provato a fare dei controlli con if ma comunque mi fa out sia in riga che colonna
a
a.pietroluongo (11250 points)
20 39 131
by (11.3k points)
edited by
La lista di parole e la matrice non sono uguali. Devi scandire la matrice per ogni parola.
s
simone.lioy (1420 points)
28 30 39
by (1.4k points)
io faccio che prendo la matrice[riga][colonna] e la confronto con la stessa posizione dentro la lista di parole, però prima di fare questo ho messo un controllo, che se la colonna è maggiore della lunghezza della parola che sto prendendo in considerazione vado avanti
a
a.pietroluongo (11250 points)
20 39 131
by (11.3k points)
devi controllare se gli indici della parola sono <  len(matrice) o len(matrice[0]).
s
simone.lioy (1420 points)
28 30 39
by (1.4k points)
ora provo, mentre per la ricorsione puoi darmi una mano?
a
a.pietroluongo (11250 points)
20 39 131
by (11.3k points)
edited by
Cosa vuoi sapere?

.
s
simone.lioy (1420 points)
28 30 39
by (1.4k points)
diciamo che non ho capito molto bene, la ricorsiva sarebbe una funzione che scorre al contrario detto in parole povere, quindi par fare una cosa del genere devo partire dalla fine, pure il caso base non mi è molto chiaro
a
a.pietroluongo (11250 points)
20 39 131
by (11.3k points)
edited by
Devi trovare 1 o più casi elementari di cui sai la soluzione (caso base), (ad esempio se la lunghezza della parola è uguale a 1, controlla se alla coordinata matrice[i][j] le lettere sono uguali), e ridurre il problema in problemi più piccoli (devi esser sicuro di finire su uno dei casi base).Poi dalle soluzioni dei problemi più piccoli devi ricavare la soluzione del problema originale.
s
simone.lioy (1420 points)
28 30 39
by (1.4k points)
grazie mille
s
simone.lioy (1420 points)
28 30 39
by (1.4k points)
comunque ancora mi da out of range,appena controllo la prima parola a destra mi va in out
a
a.pietroluongo (11250 points)
20 39 131
by (11.3k points)
Se j è l'indice della parola, devi controllare se j  <  len(matrice[0]) altrimenti in matrice[i][j] hai index out of range.
s
simone.lioy (1420 points)
28 30 39
by (1.4k points)
risolto,grazie
s
simone.lioy (1420 points)
28 30 39
by (1.4k points)
ora sono arrivato al punto che conosco tutte le parole che hanno uguali la seconda lettera verso destra o verso giù, sto pensando un modo di ricorsione ma è abbastanza difficile capire il ragionamento
a
a.pietroluongo (11250 points)
20 39 131
by (11.3k points)
Puoi calcolarti le (sotto)sequenze della parola
s
simone.lioy (1420 points)
28 30 39
by (1.4k points)
dici con la funzione ricorsiva? in che senso
a
a.pietroluongo (11250 points)
20 39 131
by (11.3k points)
edited by
Se chiami la funzione sulle (sotto)sequenze della parola sei sicuro di finire su uno dei casi base, ad esempio len(parola)==1
esempio

def funzione(parola, n):
    se caso base: # Condizione di uscita
        istruzioni
    altrimenti:
        istruzioni
        funzione(sottosequenze della parola, n) # Passo ricorsivo
s
simone.lioy (1420 points)
28 30 39
by (1.4k points)
quindi io dovrei prendere una parola della lista per esempio quelle per destra e dovrei andare a ritroso della parola fino a quando non è uguale a 1, n per che sta che non ho capito
s
simone.lioy (1420 points)
28 30 39
by (1.4k points)
ho creato la funzione che mi divide in due liste le parole che hanno lettere uguale a destra e una lista che hanno lettere uguale giu, questa funzione mi ritorna queste due liste
Tommaso Sgroi (12990 points)
10 11 91
by (13.0k points)

Durante il controllo piuttosto che andare sommare 1 per andare alla coordinata, somma una variabile D (destra) e G (giù) che possono assumere valori 0 e 1 a seconda se stai o meno sui bordi della tua matrice.

Oppure più semplicemente sui tuoi controlli degli if, puoi mettere per primo, un controllo del tipo:

  • if mi trovo alla lunghezza r==lughezza della matrice-1 allora non devo guardare a destra della matrice
  • if mi trovo alla altezza c==alteza della matrice-1 allora non devo guardare sotto alla matrice

Questo lo puoi fare semplicemente mettendo questo tipo di controllo all'interno dei tuoi if seguito da un and, così che appena trova un elemento falso seguito da un and salta tutti gli altri controlli e continua l'esecuzione.

s
simone.lioy (1420 points)
28 30 39
by (1.4k points)
grazie mille
plm (18850 points)
13 15 118
by (18.9k points)
Un trucchetto sarebbe aggiungere come bordi delle parole/simboli che sicuramente non potrai trovare nelle parole... così l'out of range diventa impossibile in quanto la ricorsione si fermerebbe prima