Rehber Java'da faktöriyel bulma

Merhabalar, bugün sizlere bir örnek üzerinden Java'da konsola girilen sayının faktöriyelinin nasıl bulunduğunu açıklayacağım.

Java:
import java.util.Scanner;

public class Example {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int answer = 1, n = 1;

        while (true) {
            System.out.println("Faktöriyelini bulmak istediğiniz sayıyı girin");
            n = scan.nextInt();

            if (n < 0) {
                System.out.println("Sayı negatif olamaz, yeniden deneyin");
                n = scan.nextInt();
            }

            for (int i = 1;i <= n;i++) {
                answer *= i;
            }
            System.out.println(n + "! = " + answer);
            answer = 1;
        }
    }
}

  1. Öncelikle Scanner sınıfı aracılığıyla konsoldan veri almak için Scanner sınıfında bir değişken oluşturduk.
  2. Sonra da while tipinde bir döngü oluşturduk ve koşula "true" yazdık. Yani sonsuza kadar kullanıcıdan sayı isteyeceğiz. Bir başka değişle siz bir sayının faktöriyelini bulduktan sonra program kapanmayacak. Artık while içinden devam ediyoruz.
  3. Şimdi de konsola kullanıcıdan sayı istediğimizi belirtmek için yazı yazdırdık ve n adında bir değişken oluşturduk. Bu değişken n!'deki n'i temsil ediyor. Bu n değerini biz vermeyeceğiz. Bu yüzden scanner yardımıyla konsoldan tamsayı tipindeki değeri okuyup n'ye değer olarak aktarıyoruz.
  4. Şimdi sıra geldi asıl kısma. Nasıl sayının faktöriyelini alacağız? Bunu anlatmadan önce de faktöriyelin sonucunu kaydetmek için bir değişken oluşturuyoruz. Bu değişkene "answer" ismi verdim ve while dışında tanımladım. Şimdi devam edebiliriz. While içine sıradaki bir işlem olarak for döngüsü açıyoruz ve "i" adında bir değişken oluşturup en fazla kullanıcının girdiği sayıya eşit olabileceğini ve her for döngüsü çalıştığında da birer birer artması gerektiğini söylüyoruz. "i <= n" yapmamızın sebebi faktöriyelin tanımının n'den 1'e kadar olan sayıların çarpımı olması.
  5. Şimdi artık for döngüsünün içine girelim ve faktöriyeli bulalım. "i" değerinin başlangıç değerini 1 verdik çünkü 0 olursa sonsuza kadar answer değişkeninin değeri 0 olur. Öncelikle i değişkeninin değerinin her döngüde 1 arttığını biliyoruz. Gelin daha detaylı düşünelim.
Faktöriyeli bulmak için kullanıcının girdiği değeri alıp her defasında bir eksiği ile çarpmalıyız. Ta ki 1'e eşit olana kadar. Bu cümleden yola çıkarak şunu düşünebiliriz.
Biz her değer azaltıldığında bir değişken yaratıp her bir değeri tutamayacağımız için answer adlı bir değişken oluşturduk. Yani local olarak kullanıcıya göstermeden kod içerisinde birer birer girilen sayıyı azaltıp ardışık sayıları çarpıyoruz.
Örnek üzerinden gidecek olursak:
Döngü ilk kez çalışmaya başladı ve answer ile i birbiriyle çarpıldı. Sonuç 1 çıktı ve cevaba aktarıldı. Döngü bitiminde i bir arttırılarak 2 oldu ve döngü içerisinde aynı işlem tekrarlandı ve bu sefer 1 ile 2 çarpıldı. Bu olay n*(n-1) olana kadar tekrarlanıyor ve en son i girilen sayıdan büyük olunca döngü tamamlanıyor. Döngü tamamlanınca biz şunu diyebiliriz: "Cevabın son hali hazır, artık kullanıcıya gösterebiliriz." Bu yüzden döngünün hemen ardından konsola cevabı yazdırdık.​

6. Şu an tamam mı? Hayır. Çünkü siz, girilen değer 0'dan büyük olmak şartıyla bir kereye mahsus değer girince çalışır. Ama ya ikinci değeri girerseniz? İkinci değeri girince answer değişkeninin değeri default değerine gelmediğinden bulunan cevaplar bir önceki cevapla çarpılıp konsola yazdırılır. Yani cevap hatalı çıkar. Bunu önlemek için de kullanıcıya cevabı gösterdikten sonra cevabı varsayılan değerine geri aldık. Peki şimdi artık her şey tamam mı? Elbette hayır. Faktöriyel bulunurken n!'deki n en az 0 olabilir. Peki kullanıcı ya konsoldan negatif değer girerse? Bizim bu olayı da düşünmemiz lazım. Bu yüzden faktöriyeli bulmadan önce yani for döngüsüne başlamadan önce girilen değerin negatif olup olmadığını sorgulamalıyız. Eğer girilen değer negatif ise uyarı mesajı verelim ve tekrar değer girilmesini isteyelim. Artık sorunlar ortadan kalktı.​
Umarım faydalı olmuştur, bu rehber genel programlama mantığını bilmeyen için maalesef fazla gelebilir. Daha çok biraz bilgisi olanlar için. Umarım karışık olmamıştır. 😀
 
Bir sonraki geliştirmesi Exception Handling olabilir.

Kullanıcı integer yerine string girdiği zaman hata verecek.

Try-catch içine alınabilir ya da Scanner sınıfının hasNextInt fonksiyonu yardımıyla girilen değerin içinde sayı olup olmadığı anlaşılabilir.
 

Geri
Yukarı