Rekurzivna funkcija Pojam funkcije ponavljanje include cstdlib include
Rekurzivna funkcija
Pojam funkcije ( ponavljanje ) #include <cstdlib> #include <iostream> using namespace std; double faktor(int x){ // funkcija vraca faktorijelu nekog prirodnog broja x double f=1; for (int i=1; i<=x; i++) f*=i; return f; } int main() { int a; cout<<"Program za izracun faktorijela "<<endl; cout<<"Upisi jedan prirodni broj"<<endl; cin>>a; cout<<faktor(a)<<" je faktorijela od "<<a<<endl; system("PAUSE"); return 0; }
Pojam rekurzije
Pojam rekurzije
Pojam rekurzije � Kada funkcija poziva samu sebe govorimo o rekurziji ili rekurzivnoj funkciji � U računalnom programu ponavljanje se može ostvariti ◦ Iteracijom ( petljom ) ◦ Rekurzijom ( funkcijom koja poziva samu sebe )
Primjer rekurzije #include <cstdlib> #include <iostream> // rekurzivna funkcija koja predstavlja petlju i računa faktorijele using namespace std; double faktor(int n){ if(n<=1) return 1; else return n*faktor(n-1); // funkcija poziva samu sebe - rekurzija } int main() { int a; double f; cout<<"Upisite prirodni broj N "; cin>>a; f=faktor(a); cout<<"Faktorijela = "<<f<<endl; system("PAUSE"); return 0; }
Primjer 1 - rekurzije Izračun faktorijela pomoću rekurzije n!=n*(n-1)*(n-2)*(n-3)* … *2*1 5!=5*4*3*2*1 Rekurzivna funkcija: n!= 1 za n<=1 OSNOVNI SLUČAJ n*(n-1)! Inače REKURZIVNI POZIV 5! =5*4! = 5*4*3*2! = 5*4*3*2*1
Rekurzije općenito � Svaka rekurzivna definicija mora navesti: ◦ Osnovni slučaj ◦ Rekurzivni poziv � Rekurzija nema petlji. Ponavljanje se postiže tako da funkcija zove samu sebe sve dok se ne dođe do osnovnog slučaja � Osnovni slučaj omogućuje da ponavljanje završi
Rekurzije � Rekurzije uglavnom daju kraći kod programa, ali se dvostruko duže izvršavaju. Razlog je u tome što program sve podatke takve rekurzivne funkcije postavlja na strukturu podataka koju nazivamo STOG � STOG ima LIFO način rada ( last in first out )
Rekurzije � Sadržaj stoga kod rekurzivnog izračuna 4!
Primjer 2 - rekurzije Napiši program sa rekurzivnom funkcijom koji će učitati prirodni broj n i ispisati prvih n brojeva Fibonaccijevog niza 1, 1, 2, 3, 5, 8, 13, 21, 34, … Po kojem se pravilu izračunava svaki sljedeći član Fibonaccijevog niza?
Primjer 2 - rekurzije Napiši program sa rekurzivnom funkcijom koji će učitati prirodni broj n i ispisati prvih n brojeva Fibonaccijevog niza 1, 1, 2, 3, 5, 8, 13, 21, 34, … Po kojem se pravilu izračunava svaki sljedeći član Fibonaccijevog niza? Svaki sljedeći element niza izračunava se kao zbroj prethodna dva elementa.
Primjer 2 - rekurzije � Matematički Fib(n)= opis Fibonaccijevog niza 1 za n<=2 OSNOVNI SLUČAJ Fib(n-1)+Fib(n-2) REKURZIVNI POZIV
Primjer 2 - rekurzije #include <cstdlib> #include <iostream> // rekurzivna funkcija za Fibonaccijev niz using namespace std; int fib(int n){ if(n==1 || n==2) return 1; return fib(n-1)+fib(n-2); // funkcija poziva samu sebe - rekurzija } int main() { int a, i; cout<<"Koliko Fibonaccijevih brojeva zelite? "; cin>>a; for(i=1; i<=a; i++) { cout<<fib(i)<<" "; } cout<<endl; system("PAUSE"); return 0; }
Rekurzija ili iteracija? � rekurzivni je kod kraći i „elegantniji” � u nekim situacijama je puno lakše napisati rekurzivni kod � rekurzivni kod u usporedbi sa iteracijom: ◦ sporije se izvršava ( zbog zapisivanja na stog ) ◦ teže se analizira ◦ često skriva tijek izvršavanja
Zadaci: 1. Napiši program koji će učitati jedan prirodni broj n i pomoću rekurzije ispisati niz brojeva: n, n-1, n-2, n-3, … , 3, 2, 1 Npr. Ako je n=4 ispisuje se 4, 3, 2, 1 2. Napiši program koji će učitati prirodni broj n i potenciju a. Program pomoću rekurzije mora izračunati na 3. Napiši program koji će učitati dva prirodna broja m i n i pomoću rekurzivne funkcije izračunati najveći zajednički djelitelj. Euklidov algoritam za izračunavanje nzd(m, n)= m nzd(n, m%n) za n=0 inače
- Slides: 16