Lezione 1: Come risolvere un problema

Come risolvere un problema

Prima fase: capire il problema

  • Mettere in evidenza le parti principali del problema.
    • Che cosa bisogna trovare?
    • Quali sono i dati?
    • Quali sono le condizioni?
  • Fare un disegno in cui inserire i dati e ciò che si vuole trovare?
  • Se necessario dare deinomiaglioggetti e introdurre una notazione adeguata.
  • È possibile soddisfare le condizioni?
 
 [G. Polya “How to solve it”. Princeton University Press 1957]
 

Seconda fase: Elaborare un piano

    • Buone idee sono basate sull’esperienza e su conoscenze precedentemente acquisite.
    • Si può trovare un problema connesso?
    • Pensare a come utilizzare il problema di cui si conosce la soluzione.
    • Hai usato tutti i dati? Hai usato tutte le ipotesi?
 

Terza fase: eseguire il piano

    • Il piano fornisce uno schema generale, bisogna convincersi che i dettagli concordino con lo schema.
    • Controllare attentamente ogni passo.
    • Convincersi della correttezza di un passo intuitivamente e formalmente.
 

Quarta fase: riflettere sulla soluzione

    • Serve per consolidare la conoscenza acquisita e per sviluppare abilità per risolvere nuovi problemi.
    • Puoi controllare il risultato?
    • Puoi ottenere il risultato in modo diverso?
    • Pensare a casi in cui è utile usare lo stesso risultato o lo stesso metodo.
 

Esempio:

Sia v un vettore di n intervalli non vuoti ordinato in senso crescente rispetto al seguente ordinamento:
[x, y] < [z, w] sse x < z (x = z y < w)
Definire una funzione che inserisce in un nuovo vettore ris ordinato anch’esso in senso crescente solo gli intervalli che sono disgiunti da tutti gli altri intervalli e restituisce la dimensione del vettore ris.
Si può scorrere il vettore v al più una volta.
 

Soluzione:

int intervalliDisgiunti(Intervalli v[], int dimV, Intervalli ris[]) { 
	int i, i_ris, maxend; 
	if (dimV == 0)
		return 0; 
	i_ris = 0; 
	maxend = v[0].start1; 
	for (i = 0; i < dimV; i++){
		if (maxend < v[i].start && (i == dimV – 1 || v[i].end < v[i+1].start)){ 
			ris[i_ris] = v[i]; i_ris++;
		} 
		if (maxend < v[i].end) 
			maxend = v[i].end;
	} 
	return i_ris; 
}

Esercizio:

Dato un vettore di n intervalli non vuoti scrivere una funzione che restituisce 1 se tutti gli intervalli sono a due a due disgiunti, 0 altrimenti.

Esempio:

Se v = [1,5], [-3,0], [7,9], [6,6], [-7,-5] la funzione restituisce 1.
Se v = [1,5], [-3,0], [3,9], [11, 18] la funzione restituisce 0.

 

Invia nuovo commento

Il contenuto di questo campo è privato e non verrà mostrato pubblicamente.
  • tags HTML permessi: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Linee e paragrafi vanno a capo automaticamente.

Maggiori informazioni sulle opzioni di formattazione.

CAPTCHA
Questa domanda serve a capire se sei un visitatore umano e per prevenire l'immissione di spam in maniera automatizzata.
15 + 0 =
Risolvi questo semplice problema matematico e inserisci il risultato. Es. per 1+3 inserire 4.