non si chiama loop infinito, ma funzione ricorsiva.
inoltre, va contro la definizione di algoritmo:
"[...]Da questa definizione si evincono le due proprietà fondamentali dell'algoritmo:
la sequenza di istruzioni finita (finitezza);
essa deve portare ad un risultato (effettività); fanno eccezione alcune formule matematiche molto particolari che permettono fino a due risultati." - wikipedia
ora mi chiedo: per quale motivo stampi il quadrato/rettangolo all'infinito?
quali sono le definizioni di rettangolo e quadrato?
rettangolo: quadrilatero con tutti gli angoli congruenti.
quadrato: quadrilatero con tutti gli angoli e i lati congruenti (poligono regolare)
l'unica differenza riguarda i lati, ma il modo per costruirli è lo stesso.
quindi, si può dire che il quadrato, non è altro che un rettangolo con base e altezza congruenti (o uguali).
quindi, se rileggi il mio sorgente, puoi capire che se invochi la mia funzione con 2 numeri diversi otterrai un rettangolo, se sono uguali invece un quadrato.
altra nota: in due cicli for, usi lo stesso nome della variabile di iterazione. se vuoi un consiglio, onde evitare problemi in futuro, usa nomi diversi per i cicli innestati.
comunque, se vuoi un consiglio, quando studi, ragiona un po' e analizza i tuoi algoritmi:
riguardo ai due cicli for:
- uso due variabili con lo stesso nome.
> mettiamo caso che io debba stampare il valore di x. la print, quale x prende?
riguardo alla ricorsività:
- usi un while 2%2 == 0
> la condizione è sempre vera, visto che il resto della divisione 2/2 è sempre 0.
perchè usare una espressione quando puoi scrivere un semplice true?
- richiami la funzione all'interno di un ciclo while infinito
> la seconda funzione che invochi, chiama un while, nel quale richiama ancora se stessa, e così all'infinito. ergo, il while non verrà mai chiuso, quindi è inutile metterlo
- hai deciso di fare una funzione ricorsiva
> non hai messo una condizione di fine. la ricorsività (una funzione che richiama se stessa) è un discorso molto difficile e mangia molte risorse a livello computazionale. è buona regola evitare questo approccio se non si sa come affrontarlo.
- sempre riguardo la ricorsività:
> usi due variabili (c e d) inizializzate a 0 e le passi come parametri. ora, usare 4 variabili al posto di 2 è un enorme spreco di memoria (proporzionalmente parlando). inoltre, a e b sono inutilizzati dopo i due for, quindi perchè non usarli?
riguardo le funzioni:
- def myfun(a, b)
> usa nomi più precisi per indicare l'operato della tua funzione: myfun è troppo generico. in questo caso, può andar bene, ma quando ti ritrovi con sorgenti grossi potresti confonderti e sbagliare
- ripetendo quello che ho detto prima:
> se non riesci ancora a capire perchè la mia funzione può stampare sia un rettangolo che un quadrato, ti propongo questo esercizio: scrivere una funzione che stampa un quadrilatero chiedendo in ingresso altezza e base. richiamarla successivamente passando come parametri h = 3, b = 2 e h = 4, b = 4