DS 001 – Recursion

Kendi kendini çağıran fonksiyonlara recursive fonksiyonlar diyoruz. Bazı problemlerin daha kolay çözülebilmesi için faydalıdır.


Tipleri

  1. Head recursion: Çağrı fonksiyonun başındaysa
  2. Tail recursion: Çağrı fonksiyonun sonundaysa
  3. Tree recursion: Birden fazla çağrı varsa
  4. Indirect recursion: A->B->A-> farklı fonksiyonlar birbirini ardı ardına çağırıyorsa
  5. Nested recursion: Çağrı içinde parametre olarak başka bir çağrı yapıyorsa
// head recursion
fun(int i){
  if(i>0){
    fun(i-1);
    cout<<i;
  }
}

// tail recursion
fun(int i){
  if(i>0){
    cout<<i;
    fun(i-1);
  }
}

// Tree recursion
fun(int i){
  ...
  return fun(i-1) * fun(i-2);
  ...
}

// Indirect recursion 
a(){
  b();
}

b(){
  a();
}

// Nested recursion
fun(int i){
  ...
  return fun(fun(i+11));
  ...  
}

Örnekler

Fibonacci

#include <iostream> 
using namespace std;

// fibonacci serisisinde her sayı kendinden 
// önceki iki sayının toplamına eşittir
// 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 -> sayılar
// 0, 1, 2, 3, 4, 5, 6,  7,  8,  9 -> indeksleri


int fibo(int indeks) {
	// öncelikle bitirme koşulunu yazıyoruz
	if (indeks == 0 || indeks == 1)
		return indeks;

	// genel ifadeyi yazıyoruz
	return fibo(indeks - 1) + fibo(indeks - 2);
}


int main(){
	for (int i = 0; i <= 10; i++)
		cout << fibo(i) << ", ";
}

// 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55,

Power

Bir sayının üstü, kuvveti:

#include <iostream> 
using namespace std;


int power(int sayi, int kuvvet) {
	if (kuvvet == 0) return 1;

	return sayi * power(sayi, kuvvet - 1);
}


int main(){

	for (int i = 0; i < 10; i++)
		cout << power(2,i) << ", ";
	// 1, 2, 4, 8, 16, 32, 64, 128, 256, 512,
}

Alternatif method

#include <iostream> 
using namespace std;

// Eğer üst çift ise sayının karesi alınıp üst yarıya bölünebilir. 
// 2^4 -> (2^2)^2 -> 4^2 
// yani 2*2*2*2 -> 16 yapmak yerine 
// 2*2 -> 4 => 4*4 -> 16 

int power(int sayi, int kuvvet) {
	if (kuvvet == 0) return 1;

	if (kuvvet % 2 == 0) // kuvvet çiftse
		return power(sayi * sayi, kuvvet / 2);
	else // kuvvet tekse
		return sayi * power(sayi, kuvvet - 1);
}


int main(){

	for (int i = 0; i < 10; i++)
		cout << power(2,i) << ", ";
	// 1, 2, 4, 8, 16, 32, 64, 128, 256, 512,
}

Seri

f(x, n) = 1 + \frac{x}{1!}+ \frac{x^2}{2!}+  \frac{x^3}{3!}+\dots +\frac{x^n}{n!}
#include <iostream> 
using namespace std;

double seri(double x, int n) {
	static double x_power;
	static int factorial;

	if (n == 0) {
		x_power = 1;
		factorial = 1;
		return 1;
	}

	return seri(x, n - 1) +
		x * x_power / n*factorial;
}

int main(){
	cout << seri(5, 5);
}


Comments

Leave a Reply

Your email address will not be published. Required fields are marked *