# 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