Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pub:labprog:2020-12-03 [2020/12/03 18:04] (current)
atrent created
Line 1: Line 1:
 +#  Note lezione (03/​12/​2020)
 +
 +lezione precedente sul wiki del corso: http://​sl-lab.it/​dokuwiki/​doku.php/​pub:​labprog:​home
 +
 +
 +## Ricorsione
 +
 +```go
 +package main
 +
 +import "​fmt"​
 +
 +func main() {
 + var n int
 + fmt.Scan(&​n)
 +
 + result := make([]int, 0, 20)
 + f(n, result)
 +    fmt.Println(result[0:​n])
 +    /​*necessaria la stampa con [0:n], altrimenti ​
 +    i numeri aggiunti vengono oscurati dalla 
 +    len della slice (che è 0)
 +    ​
 +    i dati ci sono, ma non li fa vedere se ci si 
 +    limita a eseguire Print(result) -> infatti stampa []
 +    */
 +}
 +
 +func f(n int, seq []int) {
 + seq = append(seq, n)
 +
 + if n == 1 {
 + return
 + }
 +
 + f(n-1, seq)
 +}
 +
 +```
 +
 +
 +
 +```go
 +package main
 +
 +import "​fmt"​
 +
 +func main() {
 + var n int
 + fmt.Scan(&​n)
 +
 + result := make([]int, 0, 20)
 + printSliceStruct(&​result)
 +
 + f(n, result)
 +
 + fmt.Println(result[0:​20])
 +}
 +
 +func f(n int, seq []int) {
 + printSliceStruct(&​seq)
 + seq = append(seq, n)
 + printSliceStruct(&​seq)
 +
 + if n == 1 {
 + return
 + }
 +
 + f(n-1, seq)
 +}
 +
 +func printSliceStruct(s *[]int) {
 + fmt.Printf("​(INCALL) addr=%p, addr1el=%p, len=%d, cap=%d, %v\n", s, *s, len(*s), cap(*s), s)
 +}
 +
 +```
 +Soluzione con puntatori - (più sicura)
 +```go
 +package main
 +
 +import "​fmt"​
 +
 +func main() {
 + var n int
 + fmt.Scan(&​n)
 +
 + result := make([]int, 0, 20)
 + printSliceStruct(&​result)
 +
 + f(n, &​result)
 +
 + fmt.Println(result[0:​20])
 +}
 +
 +func f(n int, seq *[]int) {
 + printSliceStruct(seq)
 + *seq = append(*seq,​ n)
 + printSliceStruct(seq)
 +
 + if n == 1 {
 + return
 + }
 +
 + f(n-1, seq)
 +}
 +
 +func printSliceStruct(s *[]int) {
 + fmt.Printf("​(INCALL) addr=%p, addr1el=%p, len=%d, cap=%d, %v\n", s, *s, len(*s), cap(*s), s)
 +}
 +
 +```
 +## Esercizi di oggi
 +
 +LINK ESERCIZI: https://​forms.gle/​gkZXsf7tZ1S9TQAz9
 +LINK UPLOAD: https://​upload.di.unimi.it/?​id=2398
 +
 +I successivi esercizi sono sul sito di upload (https://​upload.di.unimi.it/?​id=2398)
 +
 +### Domande generiche
 +
 +- potete mettere diverse liste *hardcoded* nel main per testarle, commentandole e mettere tra commento l'​output che ottenete quando le testate
 +- quando negli esercizi si parla di "lista di interi",​ si intende qualcosa del tipo 12 20 -75 3 58 (di lunghezza arbitraria; la lunghezza minima dipende dal problema; e anche eventualmente il fatto che siamo presenti valori nulli e/o negativi)
 +- per il momento assumiamo che l'​input non abbia errori (lo scopo di questi esercizi è farvi ragionare sulla ricorsione)
 +
 +- aggiunta in coda: ``slice = append(slice,​ new)``
 +
 +- aggiunta in testa ``slice = append([]T{new} , slice...)``,​ dove T è il tipo di base della slice
 +
 +- con *caso base* si intende un caso in cui si può dare una risposta immediata. Potrebbe esserci più di un caso base. Attenzione a non mettere più casi base del necessario.
 +- con *caso ricorsivo* (o *induttivo*) si intende un caso per cui posso ottenere la risposta facilmente se ho la risposta per un  sottoproblema di dimensione n-1, e per ottenere la risposta al sottoproblema invoco la funzione sul sottoproblema stesso.
 +Esempio: fattoriale(n) = n * fattoriale(n-1)
 +
 +
 +
  
pub/labprog/2020-12-03.txt · Last modified: 2020/12/03 18:04 by atrent
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0