2 19
Fibonacci sayılarını veren algoritma nasıl oluşturulur? |
Döngüsel, özyinelemeli ve dinamik programlama yaklaşımları kullanılarak n. fibonacci sayısını veren fonksiyonların kodu.
Fibonacci sayıları
Bir fibonacci sayısı, kendisinden önce gelen iki sayının toplanmasıyla elde edilir. Fibonacci dizisinin ilk iki elemanı 0 ve 1 bu kuralın dışındadır.
Yukarıda verilen her rakamın (Fn) kendisinden önceki iki rakamın (F(n-1) + F(n-2)) toplamına eşit olduğuna dikkat ediniz.
n. fibonacci sayısı
n. fibonacci sayısını elde etmek için şu formül kullanılır:
Döngüsel yaklaşım
n. fibonacci sayısını veren en basit algoritma döngüsel yaklaşımdır. Bu durumda n. fibonacci sayısını (Fn) elde etmek için n'ye kadar olan bütün fibonacci sayıları hesaplanarak elde edilmiş son iki fibonacci sayısının toplamı (F(n-1) + F(n-2)) fonskiyonun dönen değeridir.
Özyinelemeli
Özyinelemeli yaklaşıma göre yukarıda verilen döngüsel metottaki döngü (for) yerine fonksiyonda (fibRec) n. fibonacci sayısından önceki iki fibonacci sayısını eldilmek üzere (fibRec(n-1) + fibRec (n-2)) kendisi tekrar çağrılmıştır.
Dinamik programlama
Dinamik programlama yaklaşımında bir saklama alanı (fibArray dizisi) kullanılarak her fibonacci sayısı bir kez hesaplanmaktadır.
Performans
Dinamik programlama ile özyinelemeli yaklaşımları arasında çok ciddi performans farkı vardır. Ufak n sayıları için fark önemsizken, n değeri büyüdükçe (örneğin 40'tan sonra) iki fonksiyonun koşum süreleri arasındaki fark kayda değer olmaya başlamaktadır.
Bir fibonacci sayısı, kendisinden önce gelen iki sayının toplanmasıyla elde edilir. Fibonacci dizisinin ilk iki elemanı 0 ve 1 bu kuralın dışındadır.
| Fn = 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, .. |
Yukarıda verilen her rakamın (Fn) kendisinden önceki iki rakamın (F(n-1) + F(n-2)) toplamına eşit olduğuna dikkat ediniz.
| 13 = 8 + 5 89 = 55 + 34 |
n. fibonacci sayısı
n. fibonacci sayısını elde etmek için şu formül kullanılır:
| Fn = F(n-1) + F(n-2) |
Döngüsel yaklaşım
n. fibonacci sayısını veren en basit algoritma döngüsel yaklaşımdır. Bu durumda n. fibonacci sayısını (Fn) elde etmek için n'ye kadar olan bütün fibonacci sayıları hesaplanarak elde edilmiş son iki fibonacci sayısının toplamı (F(n-1) + F(n-2)) fonskiyonun dönen değeridir.
| function fib(n) { if(n <= 2) return n; var fib = 1; var prevFib = 1; for(var i=2; i<=n; i++) { var temp = fib; fib = fib + prevFib; prevFib = temp; } return fib; } |
Özyinelemeli
Özyinelemeli yaklaşıma göre yukarıda verilen döngüsel metottaki döngü (for) yerine fonksiyonda (fibRec) n. fibonacci sayısından önceki iki fibonacci sayısını eldilmek üzere (fibRec(n-1) + fibRec (n-2)) kendisi tekrar çağrılmıştır.
| function fibRec(n) { if (n < 2) return 1; return fibRec(n-1) + fibRec (n-2); } |
Dinamik programlama
Dinamik programlama yaklaşımında bir saklama alanı (fibArray dizisi) kullanılarak her fibonacci sayısı bir kez hesaplanmaktadır.
| function fibDyn (n) { var fibArray = []; fibArray[0] = 1; fibArray[1] = 1; for (var i = 2; i<=n; i++) fibArray[i] = fibArray[i-1] + fibArray[i-2]; return fibArray[n]; } |
Performans
Dinamik programlama ile özyinelemeli yaklaşımları arasında çok ciddi performans farkı vardır. Ufak n sayıları için fark önemsizken, n değeri büyüdükçe (örneğin 40'tan sonra) iki fonksiyonun koşum süreleri arasındaki fark kayda değer olmaya başlamaktadır.
Bu alana not ekleyebilirsiniz.
Başka bir sorunuz mu var?
Yorumlar (1)
Katılıyor musun? 10
performansta özyinelemeli mi iyidir yoksa dinamik yaklaşımmı anlayamadım.
11.09.2021
9/10