1.14k likes | 1.33k Views
Rekurzija. Gabrijela Krajnc. Rekurzja. Živel je mož, imel je psa, lepo ga je učil. Nekoč mu ukradel je kos mesa, zato ga je ubil. Na tablico zapisal je: Živel je mož, imel je psa, lepo ga je učil. Nekoč mu ukradel je kos mesa, zato ga je ubil. Na tablico zapisal je:
E N D
Rekurzija Gabrijela Krajnc
Rekurzja Živel je mož, imel je psa, lepo ga je učil. Nekoč mu ukradel je kos mesa, zato ga je ubil. Na tablico zapisal je: Živel je mož, imel je psa, lepo ga je učil. Nekoč mu ukradel je kos mesa, zato ga je ubil. Na tablico zapisal je: Živel je mož, imel je psa, lepo ga je učil. Nekoč mu ukradel je kos mesa, zato ga je ubil. Na tablico zapisal je: Živel je mož, imel je psa, lepo ga je učil. Nekoč mu ukradel je kos mesa, zato ga je ubil. Na tablico zapisal je: ……
Problemi • Izračunaj volumen telesa, preluknjanega nkrat • Poišči največje in najmanjše število v tabeli števil • Uredi podatke po velikosti. • Izračunaj produkt naravnih števil od 1 do n.
Primer Faktoriela Rekurzivna definicija: n! = n * (n-1) * (n-2) * … * 3 * 2 * 1 To lahko zapišemo tudi na drugi način: n * (n-1) * (n-2) * … * 3 * 2 * 1 = n * (n-1)! Faktoriela(n): Če je n = 0, je rezultat 1 sicer pa rezultat = n * faktoriela(n – 1)
Primer Faktoriela public static int fac ( int n ) { if ( n == 1 ) return 1; return n * fac ( n - 1 ); }
void main () { … … fac(4) … … } int fac ( int n ) { if ( n == 1 ) return 1; return n * fac ( n - 1 ); } main fac(4)
void main () { … … fac(4) … … } int fac ( int n ) { if ( n == 1 ) return 1; return n * fac ( n - 1 ); } main fac n___ fac(4) 4
void main () { … … fac(4) … … } int fac ( int n ) { if ( n == 1 ) return 1; return n * fac ( n - 1 ); } main fac n___ fac(4) 4
void main () { … … fac(4) … … } int fac ( int n ) { if ( n == 1 ) return 1; return n * fac ( n - 1 ); } main fac n___ 4*fac(4-1) fac(4) 4
void main () { … … fac(4) … … } int fac ( int n ) { if ( n == 1 ) return 1; return n * fac ( n - 1 ); } main fac n___ 3 fac n___ 4*fac(4-1) fac(4) 4
void main () { … … fac(4) … … } int fac ( int n ) { if ( n == 1 ) return 1; return n * fac ( n - 1 ); } main fac n___ 3 fac n___ 4*fac(4-1) fac(4) 4
void main () { … … fac(4) … … } int fac ( int n ) { if ( n == 1 ) return 1; return n * fac ( n - 1 ); } main fac n___ 3*fac(3-1) 3 fac n___ 4*fac(4-1) fac(4) 4
void main () { … … fac(4) … … } int fac ( int n ) { if ( n == 1 ) return 1; return n * fac ( n - 1 ); } main fac n___ 2 fac n___ 3*fac(3-1) 3 fac n___ 4*fac(4-1) fac(4) 4
void main () { … … fac(4) … … } int fac ( int n ) { if ( n == 1 ) return 1; return n * fac ( n - 1 ); } main fac n___ 2 fac n___ 3*fac(3-1) 3 fac n___ 4*fac(4-1) fac(4) 4
void main () { … … fac(4) … … } int fac ( int n ) { if ( n == 1 ) return 1; return n * fac ( n - 1 ); } main fac n___ 2*fac(2-1) 2 fac n___ 3*fac(3-1) 3 fac n___ 4*fac(4-1) fac(4) 4
void main () { … … fac(4) … … } fac n___ main 1 fac n___ 2*fac(2-1) 2 fac n___ 3*fac(3-1) 3 fac n___ 4*fac(4-1) fac(4) 4
void main () { … … fac(4) … … } fac n___ main 1 fac n___ 2*fac(2-1) 2 fac n___ 3*fac(3-1) 3 fac n___ 4*fac(4-1) fac(4) 4
void main () { … … fac(4) … … } fac n___ main 1 1 fac n___ 2*fac(2-1) 2 fac n___ 3*fac(3-1) 3 fac n___ 4*fac(4-1) fac(4) 4
void main () { … … fac(4) … … } int fac ( int n ) { if ( n == 1 )return 1; return n * fac ( n - 1 ); } fac n___ main 1 1 fac n___ 2*1 2 fac n___ 3*fac(3-1) 3 fac n___ 4*fac(4-1) fac(4) 4
void main () { … … fac(4) … … } main fac n___ 2*1 2 fac n___ 3*fac(3-1) 3 fac n___ 4*fac(4-1) fac(4) 4
void main () { … … fac(4) … … } main fac n___ 2 2 fac n___ 3*fac(3-1) 3 fac n___ 4*fac(4-1) fac(4) 4
void main () { … … fac(4) … … } main fac n___ 2 2 fac n___ 3*2 3 fac n___ 4*fac(4-1) fac(4) 4
void main () { … … fac(4) … … } main fac n___ 3*2 3 fac n___ 4*fac(4-1) fac(4) 4
void main () { … … fac(4) … … } main fac n___ 6 3 fac n___ 4*fac(4-1) fac(4) 4
void main () { … … fac(4) … … } main fac n___ 6 3 fac n___ 4*6 fac(4) 4
void main () { … … fac(4) … … } main fac n___ 4*6 fac(4) 4
void main () { … … fac(4) … … } main fac n___ 24 fac(4) 4
void main () { … … fac(4) … … } int fac ( int n ) { if ( n == 1 ) return 1; return n * fac ( n - 1 ); } main fac n___ 24 24 4
void main () { … … fac(4) … … } main 24
FAC(4) FAC(4) 4*
FAC(4) FAC(4) FAC(3) FAC(3) 3 * 4*
FAC(4) FAC(4) FAC(3) FAC(2) FAC(3) FAC(2) 2 * 3 * 4*
FAC(4) FAC(4) FAC(3) FAC(2) FAC(3) FAC(1) FAC(2) 2 * 3 * FAC(1) 4*
FAC(4) FAC(4) FAC(3) FAC(2) FAC(3) FAC(1) FAC(2) 2 * 1 1 3 * FAC(1) 4*
FAC(4) FAC(4) FAC(3) FAC(2) FAC(3) 2 FAC(1) FAC(2) 2 * 1 1 3 * 2 FAC(1) 4*
FAC(4) FAC(4) FAC(3) 6 FAC(2) FAC(3) 2 FAC(1) FAC(2) 2 * 1 1 3 * 2 FAC(1) 6 4*
24 FAC(4) FAC(4) FAC(3) 6 FAC(2) FAC(3) 2 FAC(1) FAC(2) 2 * 1 1 3 * 2 FAC(1) 6 4* 24
Alternativa • Namesto, da izračunavamo:n * fac ( n - 1)Lahko gremo v drugi smeri:: 1 * 2 * 3 * 4 * … * ( n - 1 ) * n (((((1) * 2) * 3) * 4 ) * … * (n - 1)) * n
Alternativa - nadaljevanje • S števcem gremo od 1 do n • Za vsako ko števec povečamo za 1, faktorieli pomnožimo vrednost števca.
Naloga • Napišite rekurzivno funkcijo, ki poišče vsoto N celih števil. • Napišite rekurzivno funkcijo, ki vpisana števila izpiše v obratnem vrstnem redu.
Drevesna rekurzija • Predpostavimo zaporedje Fibonaccijevih števil: 0, 1, 1, 2, 3, 5, 8, 13, 21, ... • To zaporedje je definirano z naslednjo formulo: /0Ko n = 0 fib(n)= |1 ko n = 1 \fib(n - 1) + fib(n - 2)drugače
Drevesna rekurzija • Programski kod, ki računa fibonačijeva števila je naslednji: int fib ( int n ) { if ( n <= 0 ) return 0; else if ( n = 1 ) return 1; else return fib ( n - 1 ) + fib ( n - 2 ) ; }
Kaj se zgodi ob klicu fib(5)? fib(5) fib(3) fib(4)
Kaj se zgodi ob klicu fib(5)? fib(5) fib(3) fib(4)
Kaj se zgodi ob klicu fib(5)? fib(5) fib(3) fib(4) fib(3) fib(2)
Kaj se zgodi ob klicu fib(5)? fib(5) fib(3) fib(4) fib(3) fib(2)
Kaj se zgodi ob klicu fib(5)? fib(5) fib(3) fib(4) fib(3) fib(2) fib(2) fib(1)