La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

RICORSIONE: DEFINIZIONI RICORSIVE Definizione ricorsiva: Definizione ricorsiva: definizione di una classe di oggetti in termini di una sottoclasse degli.

Presentazioni simili


Presentazione sul tema: "RICORSIONE: DEFINIZIONI RICORSIVE Definizione ricorsiva: Definizione ricorsiva: definizione di una classe di oggetti in termini di una sottoclasse degli."— Transcript della presentazione:

1 RICORSIONE: DEFINIZIONI RICORSIVE Definizione ricorsiva: Definizione ricorsiva: definizione di una classe di oggetti in termini di una sottoclasse degli oggetti stessi. Consiste di due fasi 1)BASE. Si definiscono uno o più oggetti 2)PASSO Induttivo. Si definiscono altri oggetti a partire da quelli già definiti. Es. n fattoriale: n!=1x2x…xn= prodotto dei primi n interi Definizione ricorsiva di n fattoriale, f(n): BASE. f(1)=1 PASSO. f(n)=f(n-1) X n, per n>1 Applicando successivamente il passo induttivo a partire da f(1) otteniamo: f(2)=f(1)x2=2, f(3)=f(2)x3=2x3=6, f(4)=f(3)x4=6x4=24,…

2 Definizione ricorsiva di n fattoriale, f(n): BASE. f(1)=1 PASSO. f(n)=f(n-1) X n Mostriamo che la definizione data è corretta, cioè consideriamo la seguente affermazione S(n): f(n)=n! e dimostriamo che S(n) vera per ogni n>1.

3 Definizione ricorsiva di n fattoriale, f(n): BASE. f(1)=1 PASSO. f(n)=f(n-1) X n Mostriamo che la definizione data è corretta, cioè consideriamo la seguente affermazione S(n): f(n)=n! e dimostriamo che S(n) vera per ogni n>1. Dimostrazione per induzione. BASE. n=1. Si ha f(n)=1=1! S(1) vera

4 Definizione ricorsiva di n fattoriale, f(n): BASE. f(1)=1 PASSO. f(n)=f(n-1) X n Mostriamo che la definizione data è corretta, cioè consideriamo la seguente affermazione S(n): f(n)=n! e dimostriamo che S(n) vera per ogni n>1. Dimostrazione per induzione. BASE. n=1. Si ha f(n)=1=1! S(1) vera PASSO. Assumiamo come i.i. che S(n) vera (f(n)=n!). Vogliamo mostrare che S(n+1) è vera.

5 Definizione ricorsiva di n fattoriale, f(n): BASE. f(1)=1 PASSO. f(n)=f(n-1) X n Mostriamo che la definizione data è corretta, cioè consideriamo la seguente affermazione S(n): f(n)=n! e dimostriamo che S(n) vera per ogni n>1. Dimostrazione per induzione. BASE. n=1. Si ha f(n)=1=1! S(1) vera PASSO. Assumiamo come i.i. che S(n) vera (f(n)=n!). Vogliamo mostrare che S(n+1) è vera. Si ha f(n+1)=f(n) x (n+1)=n! x (n+1) (per i.i.) =(1 x … x n) x (n+1)=1 x … x (n+1)= (n+1)! Quindi S(n+1) è vera.

6 Definizione ricorsiva dellordine lessicografico Definiamo in modo ricorsivo coppie di stringhe W ed X tali che W

7 Definizione ricorsiva dellordine lessicografico BASE. 1.

8 Definizione ricorsiva dellordine lessicografico BASE. 1. 0.

9 Definizione ricorsiva di espressioni aritmetiche BASE. Singole variabili, interi e reali sono espressioni aritmetiche PASSO. Se E 1 ed E 2 sono espressioni aritmetiche allora (E 1 +E 2 ), (E 1 - E 2 ), ( E 1 *E 2 ), (E1/E2), (-E 1 ) sono espressioni aritmetiche.

10 Definizione ricorsiva di espressioni aritmetiche BASE. Singole variabili, interi e reali sono espressioni aritmetiche PASSO. Se E 1 ed E 2 sono espressioni aritmetiche allora (E 1 +E 2 ), (E 1 - E 2 ), ( E 1 *E 2 ), (E1/E2), (-E 1 ) sono espressioni aritmetiche. Es. (y * (-(x+9)) è una espressione aritmetica.

11 Definizione ricorsiva di espressioni aritmetiche BASE. Singole variabili, interi e reali sono espressioni aritmetiche PASSO. Se E 1 ed E 2 sono espressioni aritmetiche allora (E 1 +E 2 ), (E 1 - E 2 ), ( E 1 *E 2 ), (E1/E2), (-E 1 ) sono espressioni aritmetiche. Es. (y * (-(x+9)) è una espressione arirmetica. Verifica: Usando la BASE: x,y e 9 sono espressioni aritmetiche

12 Definizione ricorsiva di espressioni aritmetiche BASE. Singole variabili, interi e reali sono espressioni aritmetiche PASSO. Se E 1 ed E 2 sono espressioni aritmetiche allora (E 1 +E 2 ), (E 1 - E 2 ), ( E 1 *E 2 ), (E1/E2), (-E 1 ) sono espressioni aritmetiche. Es. (y * (-(x+9)) è una espressione arirmetica. Verifica: Usando la BASE: x,y e 9 sono espressioni aritmetiche Usando il PASSO: x e 9 sono e.a. (x+9) è e.a.

13 Definizione ricorsiva di espressioni aritmetiche BASE. Singole variabili, interi e reali sono espressioni aritmetiche PASSO. Se E 1 ed E 2 sono espressioni aritmetiche allora (E 1 +E 2 ), (E 1 - E 2 ), ( E 1 *E 2 ), (E1/E2), (-E 1 ) sono espressioni aritmetiche. Es. (y * (-(x+9)) è una espressione arirmetica. Verifica: Usando la BASE: x,y e 9 sono espressioni aritmetiche Usando il PASSO: x e 9 sono e.a. (x+9) è e.a. Usando il PASSO: (x+9) è e.a. (-(x+9)) è e.a.

14 Definizione ricorsiva di espressioni aritmetiche BASE. Singole variabili, interi e reali sono espressioni aritmetiche PASSO. Se E 1 ed E 2 sono espressioni aritmetiche allora (E 1 +E 2 ), (E 1 - E 2 ), ( E 1 *E 2 ), (E1/E2), (-E 1 ) sono espressioni aritmetiche. Es. (y * (-(x+9))) è una espressione arirmetica. Verifica: Usando la BASE: x,y e 9 sono espressioni aritmetiche Usando il PASSO: x e 9 sono e.a. (x+9) è e.a. Usando il PASSO: (x+9) è e.a. (-(x+9)) è e.a. Usando il PASSO: y e (-(x+9)) e.a. (y * (-(x+9))) è e.a.

15 FUNZIONI RICORSIVE Allinterno della funzione P cè una chiamata a P (su input diverso).

16 FUNZIONI RICORSIVE Allinterno della funzione P cè una chiamata a P (su input diverso). Funzioni ricorsive Definizioni ricorsive Es. Calcolo di n! usando la definizione ricorsiva di fattoriale. Base. 1!=1 Passo. n!= (n-1)! X n

17 FUNZIONI RICORSIVE Allinterno della funzione P cè una chiamata a P (su input diverso). Funzioni ricorsive Definizioni ricorsive Es. Calcolo di n! usando la definizione ricorsiva di fattoriale. Base. 1!=1 Passo. n!= (n-1)! X n Int fact(int n) { if(n<=1) return 1 /*Base*/ else return n * fact(n-1); /*Passo*/ }

18 Int fact(int n) { if(n<=1) return 1 /*Base*/ else return n * fact(n-1); /*Passo*/ } n=1: fact(1) termina e restituisce 1!=1

19 Int fact(int n) { if(n<=1) return 1 /*Base*/ else return n * fact(n-1); /*Passo*/ } n=1: fact(1) termina e restituisce 1!=1 chiama n=2: fact(2) fact(1) 1

20 Int fact(int n) { if(n<=1) return 1 /*Base*/ else return n * fact(n-1); /*Passo*/ } n=1: fact(1) termina e restituisce 1!=1 chiama n=2: fact(2) fact(1) 1 chiama chiama n=3: fact(3) fact(2) fact(1) 2 1

21 Int fact(int n) { if(n<=1) return 1 /*Base*/ else return n * fact(n-1); /*Passo*/ } n=1: fact(1) termina e restituisce 1!=1 chiama n=2: fact(2) fact(1) 1 chiama chiama n=3: fact(3) fact(2) fact(1) 2 1 chiama chiama chiama n: fact(n) fact(n-1) … fact(1) (n-1)! (n-2)! 1

22 SelectionSort RICORSIVO Idea alla base del SelectionSort: Array A diviso in due parti A[0..i-1] ordinato A[i..n-1] elementi più grandi da ordinare 1.Trova min A[i..n-1], sia A[small] Scambia A[i] ed A[small] 2. Ordina la parte non ordinata, cioè A[i+1..n-1]

23 SelectionSort RICORSIVO Idea alla base del SelectionSort: Array A diviso in due parti A[0..i-1] ordinato A[i..n-1] elementi più grandi da ordinare 1.Trova min A[i..n-1], sia A[small] Scambia A[i] ed A[small] 2. Ordina la parte non ordinata, cioè A[i+1..n-1] BASE. Se i=n-1, la parte da ordinare è A[n-1], ok. PASSO. Se i

24 SelectionSort RICORSIVO void Rec- SelectionSort(int A[], int i, int n) int j,small,temp; { if (i

25 Numeri di FIBONACCI BASE. fib(0)=fib(1)=1; PASSO. fib(n)=fib(n-1)+fib(n-2)

26 Numeri di FIBONACCI BASE. fib(0)=fib(1)=1; PASSO. fib(n)=fib(n-1)+fib(n-2) int Fib (int n) { if (i<=1) return 1 /* Base*/ else return Fib(n-1)+Fib(n-2); /* Passo*/ }

27 Numeri di FIBONACCI int Fib (int n) { if (i<=1) return 1 /* Base*/ else return Fib(n-1)+Fib(n-2); /* Passo*/ } n=0, oppure n=1: restituisce 1 Fib(1) n=2: Fib(2)

28 Numeri di FIBONACCI int Fib (int n) { if (i<=1) return 1 /* Base*/ else return Fib(n-1)+Fib(n-2); /* Passo*/ } n=0, oppure n=1: restituisce 1 Fib(1) n=2: Fib(2) Fib(0)

29 Numeri di FIBONACCI int Fib (int n) { if (i<=1) return 1 /* Base*/ else return Fib(n-1)+Fib(n-2); /* Passo*/ } n=0, oppure n=1: restituisce 1 Fib(1) n=2: Fib(2) Fib(0) Fib(1) Fib(2) n=3: Fib(3) Fib(0)

30 Numeri di FIBONACCI int Fib (int n) { if (i<=1) return 1 /* Base*/ else return Fib(n-1)+Fib(n-2); /* Passo*/ } n=0, oppure n=1: restituisce 1 Fib(1) n=2: Fib(2) Fib(0) Fib(1) Fib(2) n=3: Fib(3) Fib(0) Fib(1)

31 Numeri di FIBONACCI int Fib (int n) { if (i<=1) return 1 /* Base*/ else return Fib(n-1)+Fib(n-2); /* Passo*/ } Fib(1) Fib(2) n=3: Fib(3) Fib(0) Fib(1) Fib(2) Fib(3) Fib(0) n=4: Fib(4) Fib(1)

32 Numeri di FIBONACCI int Fib (int n) { if (i<=1) return 1 /* Base*/ else return Fib(n-1)+Fib(n-2); /* Passo*/ } Fib(1) Fib(2) n=3: Fib(3) Fib(0) Fib(1) Fib(2) Fib(3) Fib(0) n=4: Fib(4) Fib(1) Fib(1) Fib(2) Fib(0)

33 INDUZIONE COMPLETA Vogliamo dimostrare che S(n) vale per ogni intero n>a. Dimostrazione per induzione completa: 1.BASE INDUTTIVA. Si dimostra che laffermazione è vera per il primo valore, cioè S(a) è vera. 2.PASSO INDUTTIVO. Assumiamo che S(a), S(a+1),…, S(n-1) sono tutte vere e dimostriamo che anche S(n) è vera.

34 VALIDITA delle dim. per INDUZIONE Completa Dim. per induzione S(n) vera, ogni n>a Base: S(a) vera Passo induttivo Minimo controesempio. Supponiamo S(n) falsa per qualche n. Sia b il più piccolo intero tale che S(b) falsa. DEDUCIAMO: Se b=a contraddiciamo la base. Quindi b>a. Essendo b-1>a e b = minimo intero per cui laffermazione è falsa, si ha S(a),…, S(b-1) vere Per il Passo Induttivo, se S(a),…,S(b-1) sono vere allora anche S(b) è vera. Abbiamo una contraddizione con lassunzione che S(b) falsa. Quindi ipotesi è sbagliata e non esiste intero per cui laffermazione è falsa.

35 Numeri di FIBONACCI int Fib (int n) { if (n<=1) return 1 /* Base*/ else return Fib(n-1)+Fib(n-2); /* Passo*/ } Mostriamo per induzione completa laffermazione S(n): il numero di chiamate fatte per calcolare Fib(n) è maggiore di fib(n). Per ogni n > 2

36 Numeri di FIBONACCI int Fib (int n) { if (n<=1) return 1 /* Base*/ else return Fib(n-1)+Fib(n-2); /* Passo*/ } Mostriamo per induzione completa laffermazione S(n): il numero di chiamate fatte per calcolare Fib(n) è maggiore di fib(n). Per ogni n > 2 1.BASE INDUTTIVA. S(2) è vera. 2. PASSO Ind. S(2), …, S(n-1) implicano S(n) vera.

37 Numeri di FIBONACCI int Fib (int n) { if (n<=1) return 1 /* Base*/ else return Fib(n-1)+Fib(n-2); /* Passo*/ } Mostriamo per induzione completa laffermazione S(n): il numero di chiamate fatte per calcolare Fib(n) è maggiore di fib(n). Per ogni n>1. BASE. Se n=2 abbiamo 3 chiamate, fib(2)=2. S(2) è vera.

38 Numeri di FIBONACCI int Fib (int n) { if (n<=1) return 1 /* Base*/ else return Fib(n-1)+Fib(n-2); /* Passo*/ } Mostriamo per induzione completa laffermazione S(n): il numero di chiamate (ricorsive) fatte per calcolare Fib(n) è maggiore di fib(n). Per ogni n>1. BASE. Se n=2 abbiamo 3 chiamate, fib(2)=2. S(2) vera. PASSO. Assumiamo S(2), …, S(n-1) vere. Il numero di chiamate fatte per calcolare Fib(n) è 1+(numero chiamate per Fib(n-1)) +(numero chiamate per Fib(n-2))> (per i.i.) 1+fib(n-1)+fib(n-2)=1+fib(n)>fib(n) Quindi S(n) vera.

39 Numeri di FIBONACCI Esercizio. Mostrare per induzione completa laffermazione S(n): Per ogni n>5. BASE. fib(0)=fib(1)=1; PASSO. fib(n)=fib(n-1)+fib(n-2)

40 Numeri di FIBONACCI Esercizio. Scrivere un programma iterativo per il calcolo di fib(n). Nota: è sufficiente un ciclo iterativo (con n iterazioni) BASE. fib(0)=fib(1)=1; PASSO. fib(n)=fib(n-1)+fib(n-2)

41 Sorting: MERGESORT Vogliamo ordinare lista (a 1,…,a n ). 1.Dividi lista in 2 sottoliste aventi (quasi) la stessa dimensione: (a 1,a 3,a 5,…) e (a 2,a 4,…) 2. Ordina le due liste separatamente 3. Fai merge delle due lista ottenute (ordinate) in una unica lista ordinata

42 Sorting: MERGESORT Esempio di una tecnica generale: Divide and Conquer Sottoproblema 1 (simile, più semplice) Sottoproblema 2 Problema …… Sottoproblema n Ogni sottoproblema risolto con la stessa tecnica. Finchè non si raggiunge un sottopr. risolvibile direttamente.

43 Sorting: MERGESORT Esempio di una tecnica generale: Divide and Conquer Sottoproblema 1 (simile, più semplice) Sottoproblema 2 Problema …… Sottoproblema n Ogni sottoproblema risolto con la stessa tecnica. Finchè non si raggiunge un sottopr. risolvibile direttamente. soluzione Sottoproblema 1 soluzione Sottoproblema 2 soluzione Problema … … soluzione Sottoproblema n

44 Sorting: MERGESORT Vogliamo ordinare lista (a 1,…,a n ). 1.Dividi lista in 2 sottoliste aventi (quasi) la stessa dimensione: (a 1,a 3,a 5,…) e (a 2,a 4,…) 2. Ordina le due liste separatamente 3. Fai merge delle due lista ottenute (ordinate) in una unica lista ordinata

45 MERGE (di due liste ordinate L 1,L 2 M) Es. L 1 =(1,2,7,7,9), L 2 =(2,4,7,8) M=(1,2,2,4,7,7,7,8,9) - Trova il minimo tra il primo elemento di L 1 e di L 2 Rimuovilo dalla lista di appartenenza ed aggiungilo ad M. - Ripeti Es. L 1 =(1,2,7,7,9), L 2 =(2,4,7,8), M=(), minimo=1 in L 1

46 MERGE (di due liste ordinate L 1,L 2 M) Es. L 1 =(1,2,7,7,9), L 2 =(2,4,7,8) M=(1,2,2,4,7,7,7,8,9) - Trova il minimo tra il primo elemento di L 1 e di L 2 Rimuovilo dalla lista di appartenenza ed aggiungilo ad M. - Ripeti Es. L 1 =(1,2,7,7,9), L 2 =(2,4,7,8), M=(), minimo=1 in L 1 L 1 =(2,7,7,9), L 2 =(2,4,7,8), M=(1), minimo=2 in L 1

47 MERGE (di due liste ordinate L 1,L 2 M) Es. L 1 =(1,2,7,7,9), L 2 =(2,4,7,8) M=(1,2,2,4,7,7,7,8,9) - Trova il minimo tra il primo elemento di L 1 e di L 2 Rimuovilo dalla lista di appartenenza ed aggiungilo ad M. - Ripeti Es. L 1 =(1,2,7,7,9), L 2 =(2,4,7,8), M=(), minimo=1 in L 1 L 1 =(2,7,7,9), L 2 =(2,4,7,8), M=(1), minimo=2 in L 1 L 1 =(7,7,9), L 2 =(2,4,7,8), M=(1,2), minimo=2 in L 2

48 MERGE (di due liste ordinate L 1,L 2 M) L 1 =(1,2,7,7,9), L 2 =(2,4,7,8), M=(), minimo=1 in L 1 L 1 =(2,7,7,9), L 2 =(2,4,7,8), M=(1), minimo=2 in L 1 L 1 =(7,7,9), L 2 =(2,4,7,8), M=(1,2), minimo=2 in L 2 L 1 =(7,7,9), L 2 =(4,7,8), M=(1,2,2), minimo=4 in L 2 L 1 =(7,7,9), L 2 =(7,8), M=(1,2,2,4), minimo=7 in L 1 L 1 =(7,9), L 2 =(7,8), M=(1,2,2,4,7), minimo=7 in L 1 L 1 =(9), L2=(7,8), M=(1,2,2,4,7,7), minimo=7 in L 2 L 1 =(9), L2=(8), M=(1,2,2,4,7,7,7), minimo=8 in L 1 L1=(9), L2=(), M=(1,2,2,4,7,7,7,8), L2 vuota Aggiungi L 2 ad M. M= =(1,2,2,4,7,7,7,8,9).

49 MERGESORT BASE: Se la lista contiene 0 o 1 elemento, stop Ind.: Split di (a 1,a 2, …) in (a 1,a 3,…) e (a 2,a 4,…) Mergesort delle due liste separatamente Merge delle 2 liste ordinate

50 MERGESORT

51 MERGESORT

52 MERGESORT

53 MERGESORT

54 MERGESORT

55 MERGESORT

56 MERGESORT

57 MERGESORT

58 MERGESORT

59 MERGESORT

60 MERGESORT

61 MERGESORT

62

63


Scaricare ppt "RICORSIONE: DEFINIZIONI RICORSIVE Definizione ricorsiva: Definizione ricorsiva: definizione di una classe di oggetti in termini di una sottoclasse degli."

Presentazioni simili


Annunci Google