Ana içeriğe geç

Recursive - Özyinelemeli Fonksiyonlar Nedir

Recursive fonksiyonlar, kendilerini çağıran ve belirli bir koşul gerçekleşene kadar kendini tekrar eden fonksiyonlardır. Yani, bir fonksiyon kendi içinde kendini çağırarak işlem yapar. Bu, belirli bir görevi yerine getirmek için kullanılabilir, özellikle belirli bir görevin aynı veya benzer işlemlerinin tekrarlanması gerektiği durumlarda. Özyinelemeli fonksiyonlar, bir problemi küçük alt problemlere bölerek ve bu alt problemler için aynı fonksiyonu çağırarak çalışır.

Özyinelemeli fonksiyonların avantajı, belirli bir işlemi tekrar eden yapıların tekrarlanması yerine, daha az kod yazarak bir problemi çözebilme yeteneğidir. Ancak, özyinelemeli fonksiyonlar kötü bir şekilde tasarlanırsa, aşırı yığılma hatasına (stack overflow error) neden olabilirler ve işlem hızı daha yavaş olabilir.

Özyinelemeli fonksiyonlar, örneğin faktöriyel hesaplama, Fibonacci serisi hesaplama, tüm alt dizilerin toplamı, tüm permütasyonlar gibi problemleri çözmek için kullanılabilir.

Belirli Bir Sayıya Kadar Olan Sayıların Toplamını Recursive Metodla Bulma

Belirli bir sayıya kadar olan sayıların toplamını recursive metodla bulmak için şu adımları takip edebilirsiniz:

  1. Öncelikle recursive fonksiyonu tanımlayın. Bu fonksiyon, bir parametre almalıdır. Bu parametre, toplamı alınacak olan sayıya kadar olan sayıların sayısıdır.
int sum_recursive(int n);
  1. Recursive fonksiyonun içinde bir koşul belirleyin. Bu koşul, eğer parametre sıfıra eşit veya daha küçükse, toplamın sıfır olduğunu gösterir. Bu koşul recursive fonksiyonun taban durumudur.

if (n <= 0) {
return 0;
}
  1. Eğer parametre sıfırdan büyükse, recursive fonksiyonu kendisi içinde çağırın. Ancak bu sefer parametre, bir azaltılmış değere eşit olmalıdır.

else {
return n + sum_recursive(n-1);
}
  1. Tamamlanmış kod şu şekilde olabilir:

#include <stdio.h>

int sum_recursive(int n) {
if (n <= 0) {
return 0;
}
else {
return n + sum_recursive(n-1);
}
}

int main() {
int n = 5;
int sum = sum_recursive(n);
printf("1 to %d sum: %d\n", n, sum);

return 0;
}

Bu kod, 1'den 5'e kadar olan sayıların toplamını hesaplar ve ekrana yazdırır. Recursive fonksiyon, 5'ten başlayarak 1'e kadar olan sayıların toplamını hesaplar ve sonucu geri döndürür. Recursive fonksiyonu çağıran main() fonksiyonu, hesaplanan toplamı ekrana yazdırır.

 Recursive (Özyinelemeli) Fonksiyon ile Faktöriyel Hesabı

Faktöriyel hesabı, bir sayının kendisinden küçük olan pozitif tamsayıların çarpımıdır. Özyinelemeli fonksiyonlar, faktöriyel hesaplama için sık kullanılan bir yöntemdir. Recursive bir fonksiyon kullanarak faktöriyel hesabı yapmak için şu adımları takip edebilirsiniz:

  1. Öncelikle recursive fonksiyonu tanımlayın. Bu fonksiyon, bir parametre almalıdır. Bu parametre, hesaplanacak olan sayıdır.

int factorial_recursive(int n);
  1. Recursive fonksiyonun içinde bir koşul belirleyin. Bu koşul, eğer parametre sıfıra eşit veya daha küçükse, faktöriyelinin bir olduğunu gösterir. Bu koşul recursive fonksiyonun taban durumudur.
if (n <= 0) {
return 1;
}
  1. Eğer parametre sıfırdan büyükse, recursive fonksiyonu kendisi içinde çağırın. Ancak bu sefer parametre, bir azaltılmış değere eşit olmalıdır.
else {
return n * factorial_recursive(n-1);
}
  1. Tamamlanmış kod şu şekilde olabilir:

#include <stdio.h>

int factorial_recursive(int n) {
if (n <= 0) {
return 1;
}
else {
return n * factorial_recursive(n-1);
}
}

int main() {
int n = 5;
int factorial = factorial_recursive(n);
printf("%d! = %d\n", n, factorial);

return 0;
}

Bu kod, 5 sayısının faktöriyelini hesaplar ve ekrana yazdırır. Recursive fonksiyon, 5'ten başlayarak 1'e kadar olan sayıların çarpımını hesaplar ve sonucu geri döndürür. Recursive fonksiyonu çağıran main() fonksiyonu, hesaplanan faktöriyeli ekrana yazdırır.

 Recursive Fonksiyon ile Onluk Tabandaki Sayıyı İkilik Tabanda Yazdırma

Onluk tabandaki bir sayının ikilik tabanda yazdırılması, recursive fonksiyonlarla kolaylıkla yapılabilir. Recursive fonksiyon, sayının binary formunu yazdırmak için kendisini ikili tabanda yazdırması gereken kalanıyla (mod) çağıran bir fonksiyondur.

İşlem adımları şu şekilde olabilir:

  1. Recursive fonksiyonu tanımlayın ve bir parametre alın. Bu parametre, onluk tabandaki sayıdır.
void decimal_to_binary(int decimal_num);
  1. Fonksiyonun içinde bir koşul belirleyin. Bu koşul, eğer sayı sıfıra eşitse, yazdırmayı durdurur. Bu koşul, recursive fonksiyonun taban durumudur.
if (decimal_num == 0) {
return;
}
  1. Eğer sayı sıfırdan büyükse, sayının ikili tabandaki en son basamağını bulun. Bunu yapmak için sayıyı 2'ye böler ve kalanı alın.
int binary_num = decimal_num % 2;
  1. Daha sonra, sayıyı 2'ye bölmek ve kalanını bulmak yerine, sayıyı 2'ye bölün. Bu işlem, sayının son basamağından kurtulmak için kullanılır.
decimal_num = decimal_num / 2;
  1. Recursive fonksiyonu kendisi içinde çağırın ve parametre olarak, sayının son basamağından kurtulmuş halini kullanın.
decimal_to_binary(decimal_num);
  1. Son olarak, sayının ikili tabandaki son basamağını yazdırın.
printf("%d", binary_num);
  1. Tamamlanmış kod şu şekilde olabilir:

#include <stdio.h>

void decimal_to_binary(int decimal_num) {
if (decimal_num == 0) {
return;
}

int binary_num = decimal_num % 2;
decimal_num = decimal_num / 2;
decimal_to_binary(decimal_num);

printf("%d", binary_num);
}

int main() {
int decimal_num = 23;
printf("%d (10) = ", decimal_num);
decimal_to_binary(decimal_num);
printf(" (2)\n");

return 0;
}

Bu kod, 23 sayısının ikili tabandaki karşılığını hesaplar ve ekrana yazdırır. Recursive fonksiyon, 23 sayısının ikili tabandaki karşılığını bulmak için kendisini, sayının son basamağından kurtulmuş haliyle çağırır. Son olarak, sayının son basamağını yazdırır ve işlem tamamlanır.

Fibonacci Serisi - Recursive Fonksiyonlar

Fibonacci serisi, önceki iki sayının toplamından oluşan bir sayı dizisidir. Seri genellikle 0 ve 1 ile başlar, diğer sayılar ise önceki iki sayının toplamıdır. Örneğin, ilk on sayı şu şekildedir: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.

Fibonacci serisi özyinelemeli (recursive) fonksiyonlarla yazılabilir. Bu fonksiyon, serinin n. elemanını hesaplamak için kendisini (n-1) ve (n-2) elemanlarıyla çağırır. İşlem adımları şu şekilde olabilir:

  1. Recursive fonksiyonu tanımlayın ve bir parametre alın. Bu parametre, hesaplanacak Fibonacci sayısının pozisyonudur.
int fibonacci(int n);
  1. Fonksiyonun içinde bir koşul belirleyin. Bu koşul, eğer sayı 0 veya 1'e eşitse, kendisini geri döndürür. Bu koşul, recursive fonksiyonun taban durumudur.
if (n == 0 || n == 1) {
return n;
}
  1. Eğer sayı 0 veya 1'e eşit değilse, kendisini (n-1) ve (n-2) elemanlarıyla çağırın ve bu değerleri toplayın.
int fib_n_1 = fibonacci(n-1);
int fib_n_2 = fibonacci(n-2);
return fib_n_1 + fib_n_2;
  1. Tamamlanmış kod şu şekilde olabilir:
#include <stdio.h>

int fibonacci(int n) {
if (n == 0 || n == 1) {
return n;
}

int fib_n_1 = fibonacci(n-1);
int fib_n_2 = fibonacci(n-2);
return fib_n_1 + fib_n_2;
}

int main() {
int n = 10;
printf("Fibonacci serisi: ");
for (int i = 0; i < n; i++) {
printf("%d ", fibonacci(i));
}
printf("\n");

return 0;
}