Rekursja Copyright, 2004 © Jerzy R. Nawrocki Teoretyczne podstawy informatyki Wykład 5
J.Nawrocki, Rekursja Plan wykładu Silnia Wielomian Liczby Fibonacciego Operacja minimum
J.Nawrocki, Rekursja Definiowanie indukcyjne Definiowanie indukcyjne (rekursja / rekurencja): definiujemy nieznane przez nieznane, które będzie znane Wprowadzenie Masło maślane
J.Nawrocki, Rekursja Napisz program obliczania n! 1*2*3*.. * (n-1) * n n! = ! = 1 Silnia 4 1! = 1 2! = 2 3! = 6 4! = 24
J.Nawrocki, Rekursja var n: integer; begin read(n); writeln(n, ! =, S(n) ) end. Napisz program obliczania n! 1*2*3*.. * (n-1) * n n! = Silnia 3 3 3! = 6
J.Nawrocki, Rekursja function S(n: integer): integer; var n: integer; begin read(n); writeln(n, ! =, S(n) ) end. Napisz program obliczania n! 1*2*3*.. * (n-1) * n n! = Silnia 0! = 1 n! = (n-1)! * n S(0) = 1 S(n) = S(n-1)*n S(n) = 1 jeśli n=0 S(n) = S(n-1)*n jeśli n>0
J.Nawrocki, Rekursja function S(n: integer): integer; begin if n = 0 then S:= 1; if n > 0 then S:= S(n-1) * n; end; var n: integer; begin read(n); writeln(n, ! =, S(n) ) end. Napisz program obliczania n! 1*2*3*.. * (n-1) * n n! = Silnia S(n) = 1 jeśli n=0 S(n) = S(n-1)*n jeśli n>0
J.Nawrocki, Rekursja Liczba cyfr LCyfr(0) = 1 LCyfr(1) = 1... LCyfr(9) = 1 LCyfr(n) = 1 + LCyfr(n/10)
J.Nawrocki, Rekursja Funkcja potęgowa P(a, b) = a b dla naturalnych a,b P(a, 0) = 1 P(a, b) = P(a, b-1) * a
J.Nawrocki, Rekursja Program w Pascalu if n=0 then S:= 1 else S:= S(n-1) * n Silnia function S(n: integer): integer; begin end; var n: integer; begin read(n); writeln( S(n) ) end. n 3 3 WeWy
J.Nawrocki, Rekursja Silnia function S(n: integer):integ begin if n=0 then S:= 1 else S:= S(n-1) * n end; var n: integer; begin read(n); writeln( S(n) ) end. S: n=3 if n=0 then S:= 1 else S:= S(n-1) *n Instancja funkcji Parametry + zmienne lokal. Instrukcje
J.Nawrocki, Rekursja Silnia function S(n: integer):integ begin if n=0 then S:= 1 else S:= S(n-1) * n end; var n: integer; begin read(n); writeln( S(n) ) end. S: n=3 if n=0 then S:= 1 else S:= S(n-1) * n S(n-1) S: n=2 if n=0 then S:= 1 else S:= S(n-1) * n S: n=1 if n=0 then S:= 1 else S:= S(n-1) * n S(n-1) S: n=0 S=1 if n=0 then S:= 1 else S:= S(n-1) * n
J.Nawrocki, Rekursja Silnia function S(n: integer):integ begin if n=0 then S:= 1 else S:= S(n-1) * n end; var n: integer; begin read(n); writeln( S(n) ) end. S: n=3 if n=0 then S:= 1 else S:= S(n-1) * n S(n-1) S: n=2 S=2 if n=0 then S:= 1 else S:= S(n-1) * n 1
J.Nawrocki, Rekursja Silnia function S(n: integer):integ begin if n=0 then S:= 1 else S:= S(n-1) * n end; var n: integer; begin read(n); writeln( S(n) ) end. S: n=3 if n=0 then S:= 1 else S:= S(n-1) * n 2
J.Nawrocki, Rekursja Silnia function S(n: integer):integ begin if n=0 then S:= 1 else S:= S(n-1) * n end; var n: integer; begin read(n); writeln( S(n) ) end. S: n=3 S: n=2 S: n=1 S: n=0
J.Nawrocki, Rekursja Silnia function S(n: integer):integ begin if n=0 then S:= 1 else S:= S(n-1) * n end; var n: integer; begin read(n); writeln( S(n) ) end. S: n=3 else S: n=2 else S: n=1 else S: n=0 then
J.Nawrocki, Rekursja Silnia S: n=3 else S: n=2 else S: n=1 else S: n=0 then
J.Nawrocki, Rekursja Silnia S: n=3 else S: n=2 else S: n=1 else S: n=0 then function S(n: integer):integ begin if n=0 then S:= 1 else S:= S(n-1) * n end; var n: integer; begin read(n); writeln( S(n) ) end.
J.Nawrocki, Rekursja Usuwanie rekursji function S(n: integer): integer; begin if n=0 then S:= 1 else S:= S(n-1) * n end; S(n) res S(i) = S(i-1) * iS(i) = res * i res res:= res * iS(0) = 1 res res:= 1.. S(i) S(i-1).. S(1) S(0)
J.Nawrocki, Rekursja Usuwanie rekursji function S(n: integer): integer; begin res:= 1; (* res:= S(0) *) for i:= 1 to n do res:= res * i; S:= res end; res res:= res * i res res:= 1 S(n).. S(i) S(i-1).. S(1) S(0) i= 1.. n var res,i: integer;
J.Nawrocki, Rekursja Wielomian Schemat Hornera p(x,n) = a j x n-j = a 0 x n + a 1 x n a n-1 x 1 + a n p(x, 2) = p(x, 1)*x + a 2 = = (p(x, 0)*x + a 1 )*x + a 2 = = (a 0 *x + a 1 )*x + a 2 = = a 0 *x 2 + a 1 *x + a 2 p(x, 0) = a 0 p(x, n) = p(x, n-1)*x + a n p(x, 1) = p(x, 0)*x + a 1 = a 0 *x + a 1
J.Nawrocki, Rekursja Wielomian 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,n) = a j x n-j = a 0 x n + a 1 x n a n-1 x 1 + a n p(x, n) = a 0 dla n=0 p(x, n) = p(x, n-1)*x + a n
J.Nawrocki, Rekursja Liczby Fibonacciego 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, Rekursja Liczby Fibonacciego 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, Rekursja Usuwanie 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(i) = i = f(5)= f(4) + f(3)
J.Nawrocki, Rekursja Usuwanie 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) fib[i]= i = fib[0]:= 1; fib[1]:= 1; fib[i]:= fib[i-1] + fib[i-2]; var fib: [0.. MaxI] of integer; function f(n: integer): integer; var i: integer; begin f:= fib[n] end;... MaxI for i:= 2 to n do
J.Nawrocki, Rekursja Usuwanie 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(i) = i = cab c:= b + a; a:= b; b:= c function f(n: integer): integer; var a, b, c, i: integer; begin f:= a end; for i:= 1 to n do end; begin a:= 1; b:= 1; 13 6
J.Nawrocki, Rekursja 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, Rekursja 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, Rekursja 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, Rekursja 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, Rekursja 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, Rekursja Zakończenie Koncepcja rekursji Instancja funkcji Instancja a rekord aktywacji Stos rekordów aktywacji Usuwanie rekursji Minimum efektywne Wreszcie!