Java Fibonacci Hesaplama – Yazılım geliştirme sürecinde, bir programlama dilinin sözdizimini (syntax) öğrenmek işin sadece başlangıcıdır. Asıl ustalık, problemleri çözmek için doğru ve verimli algoritmalar kurabilmekten geçer. Bilgisayar mühendisliği ve yazılım eğitimlerinde en sık karşılaşılan, temel programlama mantığını oturtmak için kullanılan en meşhur problemlerden biri de Fibonacci dizisi hesaplamalarıdır.
Bu kapsamlı rehberde, Java Fibonacci hesaplama işlemlerinin nasıl yapıldığını, bu matematiksel dizinin programlamadaki yerini ve aynı problemi çözmek için kullanabileceğimiz farklı algoritmik yaklaşımları inceleyeceğiz. Basit döngülerden başlayıp, özyinelemeli (recursive) fonksiyonlara ve oradan da performansı zirveye taşıyan dinamik programlama tekniklerine kadar adım adım ilerleyeceğiz.
Fibonacci Dizisi Nedir?
Java Fibonacci Hesaplama
İtalyan matematikçi Leonardo Fibonacci tarafından Batı dünyasına tanıtılan bu sayı dizisi, doğanın birçok yerinde karşımıza çıkan muazzam bir matematiksel düzene sahiptir. Dizinin kuralı oldukça basittir: Her sayı, kendisinden önce gelen iki sayının toplamına eşittir.
Dizi genellikle 0 ve 1 sayılarıyla başlar. Matematiksel olarak formülize etmek gerekirse:
$F_n = F_{n-1} + F_{n-2}$
Burada başlangıç değerleri şöyledir:
$F_0 = 0$
$F_1 = 1$
Bu kuralı işlettiğimizde dizinin ilk elemanları şu şekilde oluşur:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144…
Görünüşte basit olan bu toplama işlemi, işin içine bilgisayar bilimleri ve programlama girdiğinde belleği ve işlemciyi nasıl yönetmemiz gerektiğine dair bize çok derin dersler verir. Şimdi bu diziyi Java’da nasıl kodlayacağımıza farklı yöntemlerle bakalım.
Yöntem 1: Döngü (Iterative) ile Java Fibonacci Hesaplama
Java Fibonacci Hesaplama

Bir programlamaya yeni başlayan öğrencinin ilk başvuracağı ve genellikle en mantıklı olan yol, standart for veya while döngülerini kullanmaktır. İteratif yaklaşım, belleği yormaz ve doğrusal bir zaman karmaşıklığı ile çalışır.
Aşağıdaki Java kodunda, n. sıradaki Fibonacci sayısını bulmak için bir for döngüsü kullanıyoruz.
Java
public class FibonacciIterative {
public static void printFibonacci(int n) {
int first = 0;
int second = 1;
System.out.print(first + " " + second + " ");
for (int i = 2; i < n; i++) {
int next = first + second;
System.out.print(next + " ");
first = second;
second = next;
}
}
public static void main(String[] args) {
int n = 10;
System.out.println(n + " elemanlı Fibonacci dizisi:");
printFibonacci(n);
}
}
Kodun Çalışma Mantığı ve Algoritma Analizi
Yukarıdaki kodda first ve second adında iki değişken tanımladık. Çünkü kural gereği her zaman son iki sayıyı aklımızda tutmamız gerekiyor. Döngü her çalıştığında, bu iki sayıyı toplayıp next değişkenine atıyoruz. Ardından bir sonraki adıma geçmek için first değişkenine second‘ın değerini, second değişkenine ise yeni bulduğumuz next değerini aktararak sayıları bir nevi ileriye doğru kaydırıyoruz.
Bu yaklaşımın Zaman Karmaşıklığı (Time Complexity) $O(n)$’dir. Yani döngü, istenen sayı kadar döner. Alan Karmaşıklığı (Space Complexity) ise $O(1)$’dir. Ekstra bir dizi veya bellek alanı kullanmadığımız için sistem kaynaklarını son derece verimli kullanır. Mülakatlarda en çok takdir edilen, temiz ve güvenli yöntem budur.
Yöntem 2: Özyineleme (Recursive) ile Java Fibonacci Hesaplama
Java Fibonacci Hesaplama

Bilgisayar bilimlerinde bir fonksiyonun kendi kendini çağırmasına özyineleme (recursion) denir. Fibonacci dizisinin matematiksel formülü ($F_n = F_{n-1} + F_{n-2}$) yapı itibarıyla özyinelemeye birebir uygundur. Kodu yazmak çok kısa ve matematikle uyumlu olduğu için göze çok estetik gelir.
Java
public class FibonacciRecursive {
public static int fibonacci(int n) {
if (n <= 1) {
return n;
}
return fibonacci(n - 1) + fibonacci(n - 2);
}
public static void main(String[] args) {
int n = 10;
System.out.println(n + ". Fibonacci sayısı: " + fibonacci(n));
}
}
Özyinelemeli Yaklaşımın Tehlikeleri
Kodu incelediğinizde sadece birkaç satırdan oluştuğunu görebilirsiniz. Eğer n değeri 1 veya 0 ise doğrudan kendisini döndürüyor (buna base case veya durma noktası denir), aksi takdirde kendisinden önceki iki sayıyı bulmak için fonksiyonu tekrar tekrar çağırıyor.
Ancak bu yöntemin çok büyük bir problemi vardır: Performans ve Tekrar eden işlemler.
Siz fibonacci(5) değerini hesaplamak istediğinizde program fibonacci(4) ve fibonacci(3)‘ü çağırır. fibonacci(4) ise tekrar fibonacci(3) ve fibonacci(2)‘yi çağırır. Gördüğünüz gibi fibonacci(3) değeri birden fazla kez baştan hesaplanır. Sayı büyüdükçe bu ağaç devasa bir boyuta ulaşır.
Bu yöntemin Zaman Karmaşıklığı üsteldir, yani $O(2^n)$’dir. Eğer n değerini örneğin 50 yaparsanız, standart bir bilgisayarın bu işlemi bitirmesi dakikalar hatta saatler sürebilir. Ayrıca, fonksiyonlar sürekli bellekteki Call Stack (Çağrı Yığını) alanında üst üste biriktiği için StackOverflowError hatası alma riskiniz çok yüksektir.
Yöntem 3: Dinamik Programlama (Memoization) ile Optimizasyon

Java Fibonacci Hesaplama
Özyinelemeli yöntemin zarafetini seviyor ancak yavaşlığından kurtulmak istiyorsak, Dinamik Programlama imdadımıza yetişir. Temel mantık şudur: “Aynı sayıyı neden defalarca hesaplayayım? Bir kez hesapladıktan sonra bir yere kaydedeyim, tekrar lazım olduğunda oradan okuyayım.”
Bu işleme Memoization (Hatırlama/Not etme) denir. Genellikle bu iş için bir Dizi (Array) veya HashMap kullanılır.
Java
public class FibonacciMemoization {
private static long[] cache;
public static long fibonacci(int n) {
if (n <= 1) {
return n;
}
if (cache[n] != 0) {
return cache[n];
}
long result = fibonacci(n - 1) + fibonacci(n - 2);
cache[n] = result;
return result;
}
public static void main(String[] args) {
int n = 50;
cache = new long[n + 1];
System.out.println(n + ". Fibonacci sayısı: " + fibonacci(n));
}
}
Kodda Ne Değişti?
Sınıf düzeyinde bir cache (önbellek) dizisi oluşturduk. Fonksiyon çalıştığında ilk iş olarak istenen sayının daha önce hesaplanıp hesaplanmadığına (dizideki değerin 0’dan farklı olup olmadığına) bakıyor. Eğer hesaplandıysa, karmaşık işlemlere girmeden dizideki o değeri anında geri döndürüyor. Hesaplanmadıysa işlemi yapıyor ve sonucu daha sonra kullanmak üzere diziye kaydediyor.
Bu küçük dokunuş sayesinde $O(2^n)$ olan zaman karmaşıklığını, sihirli bir şekilde $O(n)$ seviyesine çekmiş oluyoruz. Özyinelemeli yöntemde bilgisayarı donduran 50. elemanı hesaplama işlemi, dinamik programlama ile milisaniyeler içinde gerçekleşir.
Java’da Büyük Fibonacci Sayıları ile Çalışmak: BigInteger
Rehberimizin bu kısmına kadar standart veri tipleri olan int ve long kullandık. Ancak Fibonacci sayıları çok hızlı büyüyen bir yapıya sahiptir.

Java’da bir int değişkeni en fazla 2 milyar civarında bir sayı tutabilir (Yaklaşık 46. Fibonacci sayısı). Bir long değişkeni ise ancak 92. Fibonacci sayısına kadar dayanabilir. 93. sayıyı hesaplamaya çalıştığınızda bellek taşması (Integer Overflow) yaşarsınız ve program size eksi (-) değerli, yanlış sonuçlar vermeye başlar.
Eğer 100., 500. veya 1000. Fibonacci sayısını hesaplamak istiyorsanız, standart ilkel (primitive) veri tipleri işinize yaramaz. Burada Java’nın java.math.BigInteger sınıfı devreye girer. BigInteger, bilgisayarınızın RAM’i (belleği) yettiği sürece teorik olarak sonsuz büyüklükteki sayılarla işlem yapmanızı sağlar.
Java
import java.math.BigInteger;
public class FibonacciBigInteger {
public static void main(String[] args) {
int n = 100;
BigInteger first = BigInteger.ZERO;
BigInteger second = BigInteger.ONE;
BigInteger next = BigInteger.ZERO;
for (int i = 2; i <= n; i++) {
next = first.add(second);
first = second;
second = next;
}
System.out.println("100. Fibonacci sayısı: " + next);
}
}
Yukarıdaki kodda standart toplama işareti (+) yerine, BigInteger sınıfına ait olan .add() metodunu kullandığımıza dikkat edin. Nesne yönelimli programlama kuralları gereği sınıflar arası işlemlerde operatörler yerine metotlar tercih edilmelidir. Bu yöntem sayesinde binlerce basamaklı sayıları bile sıfır hata ile hesaplayabilirsiniz.
Sıkça Sorulan Sorular (SSS)
1. Hangi Fibonacci algoritmasını kullanmalıyım?
Genel uygulamalar ve mülakatlar için hafıza dostu olan İteratif (Döngü) yöntem en güvenli limandır. Algoritma ve veri yapıları sınavlarındaysanız dinamik programlama (memoization) yaklaşımını bilmeniz sizden ekstra puan almanızı sağlayacaktır. Saf özyinelemeli (recursive) yöntem ise sadece mantığı anlamak içindir, üretim ortamında (production) kesinlikle kullanılmamalıdır.
2. Neden şirket mülakatlarında sürekli Fibonacci sorulur?
Bu problem adayın döngüleri kurma yeteneğini, değişkenler arası değer atamasını (variable swapping), bellek taşması (overflow) ihtimaline karşı uyanıklığını ve özyinelemeli fonksiyonların neden olabileceği performans sorunlarını bilip bilmediğini tek bir soruyla test etmeyi sağlar.
3. Altın Oran ile Fibonacci’nin Java’da bir ilgisi var mı?
Evet, ardışık iki Fibonacci sayısının birbirine bölümü her zaman altın orana (yaklaşık 1.618) yaklaşır. Java’da döngü içerisinde (double) second / first şeklinde bir bölme işlemi yaparak bu matematiksel mucizeyi konsola yazdırabilir ve dizinin ilerledikçe bu sabit sayıya nasıl kilitlendiğini gözlemleyebilirsiniz.
4. Özyineleme (Recursion) her zaman kötü müdür?
Hayır. Fibonacci hesaplamasında özyineleme yapmak performans kaybına yol açar ancak Ağaç (Tree) veri yapıları, dosya dizin sistemlerinde gezinme (Directory Traversal) veya böl-ve-fethet (Divide and Conquer) algoritmalarında (örneğin Merge Sort) özyineleme kullanmak hem kodu çok sadeleştirir hem de iteratif yollara göre çok daha yönetilebilirdir.
Sonuç
Bu rehberimizde Java fibonacci hesaplama konusunu sadece basit bir kod bloğu vererek geçmedik; arkasında yatan algoritmik düşünce tarzını, bellek yönetimini ve kod optimizasyonunu detaylarıyla ele aldık. Bir programcı olarak farklı çözümler üretebilmek, “çalışan kod” ile “kaliteli kod” arasındaki farkı belirler.
İlk başlarda sadece for döngüsü ile çözdüğünüz bu problemi, BigInteger ve Dinamik Programlama ile harmanlayarak bir üst seviyeye taşımış oldunuz. Java eğitim sürecinizde bu tür temel algoritmaları kendi IDE’nizde bol bol yazarak, farklı n değerleri verip sistemin nasıl tepki verdiğini gözlemlemek gelişiminize büyük katkı sağlayacaktır.
Kodlama serüveninizde karşılaştığınız hataları veya aklınıza takılan diğer algoritmaları yorumlar kısmında sormaktan çekinmeyin!
Dizinin Simetrik Olup Olmadığını Bulma Java: Adım Adım Algoritma Mantığı öğrenmek için tıklayın !
Daha fazla bilgiye ulaşmak için sitemizi ziyaret etmeyi unutmayın !


