Rekurencja Copyright, 2000 © Jerzy R. Nawrocki Wprowadzenie do informatyki Wykład 4
J.Nawrocki, Wprowadzenie.., Wykład 4 Plan wykładu Wprowadzenie Składanie funkcji Definiowanie indukcyjne: 1 zmienna Definiowanie indukcyjne: 2 zmienne Rekursja i zmienne rzeczywiste Operacja minimum
J.Nawrocki, Wprowadzenie.., Wykład 4 Wprowadzenie Tylko funkcje określone na zbiorze liczb naturalnych i o wartościach naturalnych * 3 5 mod ln 5 5 e Funkcje rekurencyjne
J.Nawrocki, Wprowadzenie.., Wykład 4 Plan wykładu Wprowadzenie Składanie funkcji Definiowanie indukcyjne: 1 zmienna Definiowanie indukcyjne: 2 zmienne Rekursja i zmienne rzeczywiste Operacja minimum
J.Nawrocki, Wprowadzenie.., Wykład 4 Składanie funkcji Nieparz(n)= 2*n + 1 Plus(a,b) = a + b Razy(a,b) = a * b Nieparz(n)= Plus(Razy(2,n), 1) Ujęcie matematyczne
J.Nawrocki, Wprowadzenie.., Wykład 4 Składanie funkcji var n: integer; begin read(n); writeln(2*n+1) end. Prosty program w Pascalu
J.Nawrocki, Wprowadzenie.., Wykład 4 Składanie funkcji function Plus(a,b: integer): integer; begin Plus:= a + b end; function Razy(a,b: integer): integer; begin Razy:= a * b end; var n: integer; begin read(n); writeln(Plus(Razy(2,n),1)) end. Program pascalowy z funkcjami
J.Nawrocki, Wprowadzenie.., Wykład 4 Składanie funkcji function Plus(a,b: integer): integer; begin Plus:= a + b end; function Razy(a,b: integer): integer; begin Razy:= a * b end; var n: integer; begin read(n); writeln(Plus(Razy(2,n),1)) end. n 3 WeWy Program pascalowy z funkcjami
J.Nawrocki, Wprowadzenie.., Wykład 4 Składanie funkcji function Plus(a,b: integer): integer; begin Plus:= a + b end; function Razy(a,b: integer): integer; begin Razy:= a * b end; var n: integer; begin read(n); writeln(Plus(Razy(2,n),1)) end. n 3 3 WeWy Program pascalowy z funkcjami
J.Nawrocki, Wprowadzenie.., Wykład 4 Składanie funkcji function Plus(a,b: integer): integer; begin Plus:= a + b end; function Razy(a,b: integer): integer; begin Razy:= a * b end; var n: integer; begin read(n); writeln(Plus(Razy(2,n),1)) end. n 3 3 WeWy x:=Razy(2,n) y:=Plus(x,1) writeln(y) Program pascalowy z funkcjami x y
J.Nawrocki, Wprowadzenie.., Wykład 4 Składanie funkcji function Plus(a,b: integer): integer; begin Plus:= a + b end; function Razy(a,b: integer): integer; begin Razy:= a * b end; var n: integer; begin read(n); writeln(Plus(Razy(2,n),1)) end. n 3 3 WeWy x:=Razy(2,n) y:=Plus(x,1) writeln(y) Program pascalowy z funkcjami x y
J.Nawrocki, Wprowadzenie.., Wykład 4 Składanie funkcji function Plus(a,b: integer): integer; begin Plus:= a + b end; function Razy(a,b: integer): integer; begin Razy:= a * b end; var n: integer; begin read(n); writeln(Plus(Razy(2,n),1)) end. n 3 3 WeWy x:=Razy(2,n) y:=Plus(x,1) writeln(y) Program pascalowy z funkcjami x 6 y
J.Nawrocki, Wprowadzenie.., Wykład 4 Składanie funkcji function Plus(a,b: integer): integer; begin Plus:= a + b end; function Razy(a,b: integer): integer; begin Razy:= a * b end; var n: integer; begin read(n); writeln(Plus(Razy(2,n),1)) end. n 3 3 WeWy x:=Razy(2,n) y:=Plus(x,1) writeln(y) Program pascalowy z funkcjami x 6 y
J.Nawrocki, Wprowadzenie.., Wykład 4 Składanie funkcji function Plus(a,b: integer): integer; begin Plus:= a + b end; function Razy(a,b: integer): integer; begin Razy:= a * b end; var n: integer; begin read(n); writeln(Plus(Razy(2,n),1)) end. n 3 3 WeWy x:=Razy(2,n) y:=Plus(x,1) writeln(y) Program pascalowy z funkcjami x 6 y 7
J.Nawrocki, Wprowadzenie.., Wykład 4 Składanie funkcji function Plus(a,b: integer): integer; begin Plus:= a + b end; function Razy(a,b: integer): integer; begin Razy:= a * b end; var n: integer; begin read(n); writeln(Plus(Razy(2,n),1)) end. n 3 3 WeWy x:=Razy(2,n) y:=Plus(x,1) writeln(y) Program pascalowy z funkcjami x 6 y 7
J.Nawrocki, Wprowadzenie.., Wykład 4 Składanie funkcji function Plus(a,b: integer): integer; begin Plus:= a + b end; function Razy(a,b: integer): integer; begin Razy:= a * b end; var n: integer; begin read(n); writeln(Plus(Razy(2,n),1)) end. n 3 3 We 7 Wy x:=Razy(2,n) y:=Plus(x,1) writeln(y) Program pascalowy z funkcjami x 6 y 7
J.Nawrocki, Wprowadzenie.., Wykład 4 Plan wykładu Wprowadzenie Składanie funkcji Definiowanie indukcyjne: 1 zmienna Definiowanie indukcyjne: 2 zmienne Rekursja i zmienne rzeczywiste Operacja minimum
J.Nawrocki, Wprowadzenie.., Wykład 4 Definiowanie indukcyjne: 1 zmienna Definiowanie indukcyjne (rekursja / rekurencja): definiujemy nieznane przez nieznane, które będzie znane Wprowadzenie Masło maślane
J.Nawrocki, Wprowadzenie.., Wykład 4 Definiowanie indukcyjne: 1 zmienna n! = 1*2*3*.. *(n-1)*n Silnia(0)= 1 Silnia(n)= Silnia(n-1) * n = n * Silnia(n-1) f(0)= k f(n)= h(n-1, f(n-1)) Ujęcie matematyczne
J.Nawrocki, Wprowadzenie.., Wykład 4 Definiowanie indukcyjne: 1 zmienna n! = 1*2*3*.. *(n-1)*n Silnia(0)= 1 Silnia(n)= Silnia(n-1) * n = n * Silnia(n-1) f(0)= k f(n)= h(n-1, f(n-1)) Ujęcie matematyczne f Silnia k = 1 h(x, y)= (x+1) * y h(n-1, Silnia(n-1))= (n-1+1) * Silnia(n-1)
J.Nawrocki, Wprowadzenie.., Wykład 4 Silnia(0)= 1 Silnia(n)= n * Silnia(n-1) Program w Pascalu function S(n: integer): integer; begin if n=0 then S:= 1 else S:= n * S(n-1) end; var n: integer; begin read(n); writeln( S(n) ) end. Definiowanie indukcyjne: 1 zmienna
J.Nawrocki, Wprowadzenie.., Wykład 4 Program w Pascalu function S(n: integer): integer; begin if n=0 then S:= 1 else S:= n * S(n-1) end; var n: integer; begin read(n); writeln( S(n) ) end. Definiowanie indukcyjne: 1 zmienna Zmienić S na Silnia
J.Nawrocki, Wprowadzenie.., Wykład 4 Definiowanie indukcyjne: 1 zmienna Program w Pascalu function S(n: integer): integer; begin if n=0 then S:= 1 else S:= n * S(n-1) end; var n: integer; begin read(n); writeln( S(n) ) end. A jak damy -1 ?
J.Nawrocki, Wprowadzenie.., Wykład 4 Definiowanie indukcyjne: 1 zmienna Program w Pascalu function S(n: integer): integer; begin if n<=0 then S:= 1 else S:= n * S(n-1) end; var n: integer; begin read(n); writeln( S(n) ) end. A jak damy -1 ?
J.Nawrocki, Wprowadzenie.., Wykład 4 Definiowanie indukcyjne: 1 zmienna Program w Pascalu function S(n: integer): integer; begin if n<=0 then S:= 1 else S:= n * S(n-1) end; var n: integer; begin read(n); writeln( S(n) ) end. n 3 WeWy
J.Nawrocki, Wprowadzenie.., Wykład 4 Definiowanie indukcyjne: 1 zmienna Program w Pascalu function S(n: integer): integer; begin if n<=0 then S:= 1 else S:= n * S(n-1) end; var n: integer; begin read(n); writeln( S(n) ) end. n 3 3 WeWy
J.Nawrocki, Wprowadzenie.., Wykład 4 Definiowanie indukcyjne: 1 zmienna Program w Pascalu function S(n: integer): integer; begin if n<=0 then S:= 1 else S:= n * S(n-1) end; var n: integer; begin read(n); writeln( S(n) ) end. n 3 3 WeWy
J.Nawrocki, Wprowadzenie.., Wykład 4 Definiowanie indukcyjne: 1 zmienna function S(n: integer):integ begin if n<=0 then S:= 1 else S:= n * S(n-1) end; var n: integer; begin read(n); writeln( S(n) ) end. S: n=3 if n<=0 then S:= 1 else S:= n * S(n-1)
J.Nawrocki, Wprowadzenie.., Wykład 4 Definiowanie indukcyjne: 1 zmienna function S(n: integer):integ begin if n<=0 then S:= 1 else S:= n * S(n-1) end; var n: integer; begin read(n); writeln( S(n) ) end. S: n=3 if n<=0 then S:= 1 else S:= n * S(n-1) S(n-1) S: n=2 if n<=0 then S:= 1 else S:= n * S(n-1)
J.Nawrocki, Wprowadzenie.., Wykład 4 Definiowanie indukcyjne: 1 zmienna function S(n: integer):integ begin if n<=0 then S:= 1 else S:= n * S(n-1) end; var n: integer; begin read(n); writeln( S(n) ) end. S: n=3 if n<=0 then S:= 1 else S:= n * S(n-1) S(n-1) S: n=2 if n<=0 then S:= 1 else S:= n * S(n-1) S(n-1) S: n=1 if n<=0 then S:= 1 else S:= n * S(n-1)
J.Nawrocki, Wprowadzenie.., Wykład 4 Definiowanie indukcyjne: 1 zmienna function S(n: integer):integ begin if n<=0 then S:= 1 else S:= n * S(n-1) end; var n: integer; begin read(n); writeln( S(n) ) end. S: n=3 if n<=0 then S:= 1 else S:= n * S(n-1) S(n-1) S: n=2 if n<=0 then S:= 1 else S:= n * S(n-1) S: n=1 if n<=0 then S:= 1 else S:= n * S(n-1) S(n-1) S: n=0 if n<=0 then S:= 1 else S:= n * S(n-1)
J.Nawrocki, Wprowadzenie.., Wykład 4 Definiowanie indukcyjne: 1 zmienna function S(n: integer):integ begin if n<=0 then S:= 1 else S:= n * S(n-1) end; var n: integer; begin read(n); writeln( S(n) ) end. S: n=3 if n<=0 then S:= 1 else S:= n * S(n-1) S(n-1) S: n=2 if n<=0 then S:= 1 else S:= n * S(n-1) S: n=1 if n<=0 then S:= 1 else S:= n * S(n-1) S(n-1) S: n=0 if n<=0 then S:= 1 else S:= n * S(n-1)
J.Nawrocki, Wprowadzenie.., Wykład 4 Definiowanie indukcyjne: 1 zmienna function S(n: integer):integ begin if n<=0 then S:= 1 else S:= n * S(n-1) end; var n: integer; begin read(n); writeln( S(n) ) end. S: n=3 if n<=0 then S:= 1 else S:= n * S(n-1) S(n-1) S: n=2 if n<=0 then S:= 1 else S:= n * S(n-1) S: n=1 if n<=0 then S:= 1 else S:= n * S(n-1) S(n-1) S: n=0 S=1 if n<=0 then S:= 1 else S:= n * S(n-1)
J.Nawrocki, Wprowadzenie.., Wykład 4 Definiowanie indukcyjne: 1 zmienna function S(n: integer):integ begin if n<=0 then S:= 1 else S:= n * S(n-1) end; var n: integer; begin read(n); writeln( S(n) ) end. S: n=3 if n<=0 then S:= 1 else S:= n * S(n-1) S(n-1) S: n=2 if n<=0 then S:= 1 else S:= n * S(n-1) S: n=1 if n<=0 then S:= 1 else S:= n * S(n-1) S(n-1) 1
J.Nawrocki, Wprowadzenie.., Wykład 4 Definiowanie indukcyjne: 1 zmienna function S(n: integer):integ begin if n<=0 then S:= 1 else S:= n * S(n-1) end; var n: integer; begin read(n); writeln( S(n) ) end. S: n=3 if n<=0 then S:= 1 else S:= n * S(n-1) S(n-1) S: n=2 if n<=0 then S:= 1 else S:= n * S(n-1) S: n=1 S=1 if n<=0 then S:= 1 else S:= n * S(n-1) S(n-1) 1
J.Nawrocki, Wprowadzenie.., Wykład 4 Definiowanie indukcyjne: 1 zmienna function S(n: integer):integ begin if n<=0 then S:= 1 else S:= n * S(n-1) end; var n: integer; begin read(n); writeln( S(n) ) end. S: n=3 if n<=0 then S:= 1 else S:= n * S(n-1) S(n-1) S: n=2 if n<=0 then S:= 1 else S:= n * S(n-1) 1
J.Nawrocki, Wprowadzenie.., Wykład 4 Definiowanie indukcyjne: 1 zmienna function S(n: integer):integ begin if n<=0 then S:= 1 else S:= n * S(n-1) end; var n: integer; begin read(n); writeln( S(n) ) end. S: n=3 if n<=0 then S:= 1 else S:= n * S(n-1) S(n-1) S: n=2 S=2 if n<=0 then S:= 1 else S:= n * S(n-1) 1
J.Nawrocki, Wprowadzenie.., Wykład 4 Definiowanie indukcyjne: 1 zmienna function S(n: integer):integ begin if n<=0 then S:= 1 else S:= n * S(n-1) end; var n: integer; begin read(n); writeln( S(n) ) end. S: n=3 if n<=0 then S:= 1 else S:= n * S(n-1) 2
J.Nawrocki, Wprowadzenie.., Wykład 4 Definiowanie indukcyjne: 1 zmienna function S(n: integer):integ begin if n<=0 then S:= 1 else S:= n * S(n-1) end; var n: integer; begin read(n); writeln( S(n) ) end. S: n=3 S=6 if n<=0 then S:= 1 else S:= n * S(n-1) 2
J.Nawrocki, Wprowadzenie.., Wykład 4 Definiowanie indukcyjne: 1 zmienna Program w Pascalu function S(n: integer): integer; begin if n<=0 then S:= 1 else S:= n * S(n-1) end; var n: integer; begin read(n); writeln( S(n) ) end. n 3 3 We 6 Wy
J.Nawrocki, Wprowadzenie.., Wykład 4 Plan wykładu Wprowadzenie Składanie funkcji Definiowanie indukcyjne: 1 zmienna Definiowanie indukcyjne: 2 zmienne Rekursja i zmienne rzeczywiste Operacja minimum
J.Nawrocki, Wprowadzenie.., Wykład 4 Definiowanie indukcyjne: 2 zmienne a b = a*a*a*.. *a P(a,0)= 1 P(a,n)= a * P(a, n-1) f(x, 0)= g(x) f(x, n)= h(x, n-1, f(x, n-1)) Ujęcie matematyczne
J.Nawrocki, Wprowadzenie.., Wykład 4 Definiowanie indukcyjne: 2 zmienne a b = a*a*a*.. *a P(a,0)= 1 P(a,n)= a * P(a, n-1) f(x, 0)= g(x) f(x, n)= h(x, n-1, f(x, n-1)) Ujęcie matematyczne f P g(x) = 1 h(x, y, z)= x * z P(a, n)= h(a, n-1, P(a, n-1))= a * P(a, n-1)
J.Nawrocki, Wprowadzenie.., Wykład 4 Definiowanie indukcyjne: 2 zmienne P(a,0)= 1 P(a,n)= a * P(a, n-1) Program w Pascalu function P(a,n: integer): integer; begin if n=0 then P:= 1 else P:= a * P(a, n-1) end; var a,n: integer; begin read(a,n); writeln( P(a,n) ) end.
J.Nawrocki, Wprowadzenie.., Wykład 4 Plan wykładu Wprowadzenie Składanie funkcji Definiowanie indukcyjne: 1 zmienna Definiowanie indukcyjne: 2 zmienne Rekursja i zmienne rzeczywiste Operacja minimum
J.Nawrocki, Wprowadzenie.., Wykład 4 Rekursja i zmienne rzeczywiste Schemat Hornera p(x) = a n x n + a n-1 x n a 1 x + a 0 p(x) = a j x j p(x) = (..((a n x + a n-1 )x + a n-2 )x + a n-3..)x + a 0 p(x) = a 0 p(x) = a 1 x + a 0 p(x) = (a 2 x + a 1 )x + a 0 p(x) = ((a 3 x + a 2 )x + a 1 )x + a 0 Tradycyjne ujęcie
J.Nawrocki, Wprowadzenie.., Wykład 4 Rekursja i zmienne rzeczywiste Schemat Hornera p(x) = a 0 x n + a 1 x n a n-1 x + a n p(x) = a j x n-j p(x) = (..((a 0 x + a 1 )x + a 2 )x + a 3..)x + a n p(x) = a 0 p(x) = a 0 x + a 1 p(x) = (a 0 x + a 1 )x + a 2 p(x) = ((a 0 x + a 1 )x + a 2 )x + a 3 Inne ujęcie
J.Nawrocki, Wprowadzenie.., Wykład 4 Rekursja i zmienne rzeczywiste (a 0 x + a 1 )x + a 2 a j a[ j ] Schemat Hornera var a: array[0..nMax] of real; function p(x: real; n: integer): real; begin if n=0 then p:= a[0] else p:= p(x, n-1)*x + a[n] end; p(x) = a j x n-j
J.Nawrocki, Wprowadzenie.., Wykład 4 Plan wykładu Wprowadzenie Składanie funkcji Definiowanie indukcyjne: 1 zmienna Definiowanie indukcyjne: 2 zmienne Rekursja i zmienne rzeczywiste Usuwanie rekursji Operacja minimum
J.Nawrocki, Wprowadzenie.., Wykład 4 Usuwanie rekursji Wady rekursji function f(j: integer): integer; begin if j<=1 then f:= 1 else f:= f(j-1) + f(j-2) end; f(0) = 1, f(1) = 1 f(i+2) = f(i+1) + f(i) f(0) = 1, f(1) = 1 f(i+2) = f(i+1) + f(i)
J.Nawrocki, Wprowadzenie.., Wykład 4 Usuwanie rekursji Wady rekursji f(0) = 1, f(1) = 1 f(i+2) = f(i+1) + f(i) f(0) = 1, f(1) = 1 f(i+2) = f(i+1) + f(i) f(5)= f(4) + f(3) f(4)= f(3) + f(2)f(3)= f(2) + f(1) f(2)= f(1) + f(0)
J.Nawrocki, Wprowadzenie.., Wykład 4 Plan wykładu Wprowadzenie Składanie funkcji Definiowanie indukcyjne: 1 zmienna Definiowanie indukcyjne: 2 zmienne Rekursja i zmienne rzeczywiste Usuwanie rekursji Operacja minimum
J.Nawrocki, Wprowadzenie.., Wykład 4 Operacja minimum Log2(x)= Log 2 x Log2(x)=w 2 w x < 2 w+1 Log2(x)= najmn. w : x < 2 w+1 Log2(x)= ( w) [ x < 2 w+1 ] f(x)= ( y) [ R(x,y) ] Ujęcie matematyczne
J.Nawrocki, Wprowadzenie.., Wykład 4 Operacja minimum function f(x: integer): integer; var y: integer; begin y:= 0; while not R(x,y) do y:= y + 1 f:= y end; f(x)= ( y) [ R(x,y) ] Schemat funkcji w Pascalu
J.Nawrocki, Wprowadzenie.., Wykład 4 Operacja minimum Log2(x)= ( w) [ x < 2 w+1 ] Funkcja w Pascalu function f(x: integer): integer; var w: integer; begin w:= 0; while not (x < P(2, w+1)) do w:= w + 1; f:= w end;
J.Nawrocki, Wprowadzenie.., Wykład 4 Operacja minimum Log2(x)= ( w) [ x < 2 w+1 ] Funkcja w Pascalu function f(x: integer): integer; var p,w: integer; begin w:= 0; p:= 2; (* 2^(0+1) = 2 *) while not (x < p) do begin w:= w + 1; p:= p * 2 end; f:= w end;
J.Nawrocki, Wprowadzenie.., Wykład 4 Operacja minimum Minus1(x)= ( y) [ x < y + 2 ] --- efektywne -- f(x)= ( y) [ R(x,y) ] x y R(x,y) Minus1(x)= ( y) [ x = y + 1 ] --- nieefektywne --- Minimum efektywne
J.Nawrocki, Wprowadzenie.., Wykład 4 Funkcje rekurencyjne Najmniejsza klasa funkcji zawierająca zero i następnik oraz zamknięta ze względu na operacje: składania funkcji, rekursji prostej, minimum efektywnego. Klasa funkcji obliczalnych
J.Nawrocki, Wprowadzenie.., Wykład 4 Zakończenie Jak usuwać rekursję? Programowanie funkcyjne (Lisp, Huskell, Miranda) Zadania: Schemat Hornera dla p(x) = a j x j Liczba automorficzna Problem podziału zbioru * Wreszcie!
J.Nawrocki, Wprowadzenie.., Wykład 4 Literatura A. Grzegorczyk, Logika matematyczna, PWN
J.Nawrocki, Wprowadzenie.., Wykład 4 Ocena wykładu 1. Wrażenie ogólne? (1 - 6) 2. Zbyt wolno czy zbyt szybko? 3. Czy dowiedziałeś się czegoś ważnego? 4. Co poprawić i jak?