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.

hw4 bis funzione ricorsiva

DRDLCN (8070 points)
27 68 104
in HW4bis by (8.1k points)
recategorized by
Allora ho trovato una strada per risolvere l'esercizio, ho usato le classi Nodi (dove all'interno differenzio tra radice e nodo ) ora sto cercando i figli della radice e lo faccio con i famosi 4 if , se trovo il punto bianco chiamo una funzione esterna rircorsiva a cui passo le coordinate e da dove vengo con lo spostamento, che scorre (richiamandosi) tutti i punti bianchi con vari controlli..come passo base ho messo che se il punto in questione è rosso ritorno le coordinate....

il punto è questo il punto rosso viene trovato, se metto un print nel passo base funziona e printo le coordinate, ma mi serve il return perche mi serve il valore nella classe dove cercavo i figli, cosi avendo le coordinate posso costruire il nodo e richiamare il metodo figli

se provo con return mi dice mi ritorna None o bound method qualcosa.....

1 Answer

_andrea_ (45670 points)
11 42 297
by (45.7k points)
se provo con return mi dice mi ritorna None o bound method qualcosa.....

Se provi con return, ma cosa ci metti dopo return?
DRDLCN (8070 points)
27 68 104
by (8.1k points)
ho provato tutto per esempio return True o return 1000, il problema e nella funzione perche se io chiamo la funzione in consolo mi ritorna None, mentre se printo mi ritorna giusto, bah
_andrea_ (45670 points)
11 42 297
by (45.7k points)
Si ma tu devi ritornare il nodo, mica True. Se ti serve il nodo devi tornare il nodo. Se torni True, il nodo lo trovi ma lo perdi alla fine della funzione. Anche in questo caso devi farti uno schema per capire cosa vuoi che ti torni la funzione, perché ciò che torni una volta lo torni tutte le volte, quindi anche alla prima chiamata e anche a quelle intermedie. Se torni un oggetto Nodo devi fare in modo che il nodo per cui stai cercando i figli, li aggiunga a sé stesso come figli, se torni direttamente la lista di figli dovrai fare in un altro modo ecc
DRDLCN (8070 points)
27 68 104
by (8.1k points)
se io nel passo baso creo il nodo e lo ritorno comunque mi ritorna None , io vorre ritornare le coordinate e poi il nodo lo creo nella classe..
_andrea_ (45670 points)
11 42 297
by (45.7k points)
Se crei il nodo non può ritornare none a meno che hai sbagliato qualcos'altro
DRDLCN (8070 points)
27 68 104
by (8.1k points)
ho fatto in un altro modo, ho passato anche il padre alla funzione e aggiungo il nodo figlio direttamente nella funzione, funziona
_andrea_ (45670 points)
11 42 297
by (45.7k points)
Quindi ora ti funziona?
DRDLCN (8070 points)
27 68 104
by (8.1k points)
yes, ora sto pensando a  come colorare i punti bianchi del percorso piu lontano, ok avendo le coordinate non è difficile trovare i nodi piu lontani ma il problema è come colorare, cioè per andare da un nodo all'altro non posso usare la funzione a 4 if perchè potrei andare a finire in qualche ramo, stavo pensando di salvarmi i vari punti bianchi per ogni nodo, magari in un lista del tipo self.listapuntibianchi

cosi per andare da un nodo all'altro mi controllo i punti bianchi di quel nodo e li percorro tutti e li coloro
_andrea_ (45670 points)
11 42 297
by (45.7k points)
Questo non ricordo come l'ho fatto. Probabile che anche io ho salvato i bianchi che collegano un padre a un figlio, e poi dopo aver trovato quali due nodi colorare li ho colorati, sapendo le coordinate che li collegano
DRDLCN (8070 points)
27 68 104
by (8.1k points)
esatto!!! pero' aspetta i due nodi lontani non sono i piu lontani in linea d'aria..ma i piu lontadi attraverso i pixel bianchi no?
_andrea_ (45670 points)
11 42 297
by (45.7k points)
Questo non me lo ricordo, leggi il testo che sicuramente c'è scritto
DRDLCN (8070 points)
27 68 104
by (8.1k points)
sto mettendo i relativi punti bianchi per ogni nodo, cè un problema pero quando il nodo ha piu figli, non riesco a differenziare i percorsi...mi spiego i 3 nodi figli hanno percorsi diversi quindi punti bianchi diversi invece mi torna che i figli hanno tutti gli stessi punti...il problema sicuramente è nella ricorsione, dovrebbe funzionare cosi: quando i pixel bianchi si sdoppiano i percorsi si differenziano ma non saprei come farlo
_andrea_ (45670 points)
11 42 297
by (45.7k points)
Ah ok ora penso di aver ricordato come ho fatto. Se non sbaglio ho fatto un'altra funzione ricorsiva che esplora l'immagine da un nodo all'altro che devi collegare, e si segna i pixel bianchi che li collegano. O qualcosa del genere
DRDLCN (8070 points)
27 68 104
by (8.1k points)
eh ci stavo pensando solo che penso ci sia lo stesso problema no?

se devo collegare il padre con un figlio esploro l'immagine e cerco il percorso bianco? ma non se ci sono diramazioni?
_andrea_ (45670 points)
11 42 297
by (45.7k points)
In qualche modo l'ho fatto ma non ricordo come in questo momento. Magari quando ho tempo vado a vedere su spyder per ricordarmi qualcosa
DRDLCN (8070 points)
27 68 104
by (8.1k points)
va bene grazie, se ti ricordi scrivi qui sotto bro
_andrea_ (45670 points)
11 42 297
by (45.7k points)
sono andato a riguardare e come immaginavo non ho capito niente di quello che ho fatto, però ho visto che mi sono fatto una funzione altezza che torna l'altezza di un albero, una funzione diametro che prende le altezze dell'albero e ne calcola il diametro, e dopo questo collego i nodi che devo collegare in qualche modo con una funzione simile a quella con cui esploro l'immagine
DRDLCN (8070 points)
27 68 104
by (8.1k points)
Il diametro? Cosa è?

E l’altezza a cosa ti è servita? Cosa ci hai fatto con il diametro , ti giuro sono 8 ore che ci sbatto la testa ma non mi arrendo

Ora che sono uscito mi è venuta in mente una cosa :

Il problema mio è sulle diramazioni doppie cioè quando il percorso si sdoppia, io pixel per pixel inserisco le coordinate in una lista e quando arrivò ad un nodo gliela aggiungo come attributo,  quando arriva alla sdoppiamento(quindi vado a due nodi diversi) del percorso Sdoppio anche la lista così se ne costruiscono 2 diverse e non una grande

Secondo te?
_andrea_ (45670 points)
11 42 297
by (45.7k points)
Il diametro è la distanza maggiore tra le foglie, se non sbaglio. Io l'ho calcolata come la somma delle due massime altezze, anche se so che è sbagliato farlo così infatti so che il mio metodo potrebbe non passare i test segreti se il diametro sbaglia, solo che non sono riuscito a fare di meglio perché col diametro ti calcoli proprio le due foglie più distanti tra loro e poi ricorsivamente esplori l'immagine fino a collegarle
DRDLCN (8070 points)
27 68 104
by (8.1k points)
Però aspetta, non per forza la distanza massima è tra due foglie eh puo anche essere tra un nodo è una foglia o anche la radice e una foglia
_andrea_ (45670 points)
11 42 297
by (45.7k points)
No, perché se fosse tra un nodo e una foglia, ma quel nodo avesse un figlio, allora quel figlio sarebbe più lontano dalla foglia rispetto al nodo. L'unico modo è che quel nodo non abbia figli, cioè che sia una foglia. Per quanto riguarda la radice, potrebbe valere solo se ha un solo figlio
DRDLCN (8070 points)
27 68 104
by (8.1k points)
OHai ragioniassima, Quindi ti calcoli le due foglie più lontane dalla radice (con un contatore di pixel bianchi) e quello è il percorso da colorare?

Fino a qui nulla di complicato il problema è colorare e di conseguenza salvarsi il percorso come attributo in ogni nodo
DRDLCN (8070 points)
27 68 104
by (8.1k points)
Se ci pensi il diametro non serve, basta calcolarsi le fogli più lontante dalla radice, è quello sarà il percorso più lungo
_andrea_ (45670 points)
11 42 297
by (45.7k points)
No quello me lo calcolo dopo. Praticamente nel diametro mi salvo sia le foglie da collegare che il nodo intermedio tra loro, cioè quello per cui devi passare per collegarle. Poi procedo a collegare la prima foglia al nodo intermedio usando il percorso più corto (perché è quello più corto quello che non passa per nessun altro nodo inutile, e collega direttamente la foglia al nodo intermedio) e dopo collego il nodo intermedio alla seconda foglia, salvando in un insieme tutti i pixel per cui passo. Così ottengo sia i pixel da colorare che il loro numero
_andrea_ (45670 points)
11 42 297
by (45.7k points)
No così potresti sbagliare. Metti che la radice ha un figlio che ha due figli, entrambi foglie. Il diametro partirebbe da una delle due foglie, passerebbe per il figlio della radice e andrebbe nella seconda foglia senza passare dalla radice. Coloreresti dei pixel in più
DRDLCN (8070 points)
27 68 104
by (8.1k points)
Non ho capito come ti calcoli il diametro allora
_andrea_ (45670 points)
11 42 297
by (45.7k points)
eh...nemmeno io...
DRDLCN (8070 points)
27 68 104
by (8.1k points)
Va bene ci provo