public class RekursiDasar {

    public static void main(String[] args) {
        System.out.println("=== Jejak panggilan faktorial(5) ===");
        long hasil = faktorial(5, 0);
        System.out.println("faktorial(5) = " + hasil);

        System.out.println();
        System.out.println("=== Fibonacci rekursif ===");
        for (int n = 0; n <= 10; n++) {
            System.out.printf("fib(%2d) = %4d%n", n, fib(n));
        }
    }

    // Rekursi dengan jejak: kedalaman menentukan lekukan agar tumpukan terlihat.
    static long faktorial(int n, int kedalaman) {
        System.out.println("  ".repeat(kedalaman) + "masuk faktorial(" + n + ")");
        if (n <= 1) {
            System.out.println("  ".repeat(kedalaman) + "kasus dasar: kembalikan 1");
            return 1;
        }
        long hasilNMinus1 = faktorial(n - 1, kedalaman + 1);
        long hasil = n * hasilNMinus1;
        System.out.println("  ".repeat(kedalaman) + n + " * " + hasilNMinus1
                + " = " + hasil);
        return hasil;
    }

    static long fib(int n) {
        if (n <= 1) {
            return n;    // dua kasus dasar: fib(0) dan fib(1)
        }
        return fib(n - 1) + fib(n - 2);
    }
}
