Kunci jawaban 03 Latihan Fungsi. Coba sendiri dulu ya.

3.1 Minimum

function min(a, b) {
  if (a < b) return a;
  else return b;
}

Kenapa: begitu satu return dieksekusi, fungsi langsung berhenti, jadi cabang yang benar yang menentukan hasilnya. Versi satu baris pakai ternary: const min = (a, b) => a < b ? a : b;.

→ Soal: 03 Latihan Fungsi > 3.1 Minimum

3.2 Rekursi (isEven)

function isEven(n) {
  if (n == 0) return true;
  else if (n == 1) return false;
  else if (n < 0) return isEven(-n);
  else return isEven(n - 2);
}

Kenapa: dua kasus dasar (0 dan 1) menghentikan rekursi; kasus umum mengecilkan n dua langkah mendekati kasus dasar. Tanpa cabang n < 0, isEven(-1) memanggil isEven(-3), isEven(-5), dan seterusnya — tak pernah sampai 0 atau 1, sampai stack habis (error “too much recursion”). Perbaikannya: angka negatif punya kegenapan yang sama dengan positifnya, jadi isEven(-n).

→ Soal: 03 Latihan Fungsi > 3.2 Rekursi (isEven)

3.3 Menghitung Karakter

function countChar(string, ch) {
  let jumlah = 0;
  for (let i = 0; i < string.length; i++) {
    if (string[i] == ch) jumlah += 1;
  }
  return jumlah;
}
 
function countBs(string) {
  return countChar(string, "B");
}

Kenapa: countChar adalah konsep yang lebih umum (hitung karakter apa pun), dan countBs cuma kasus khususnya — satu baris yang memanggil fungsi umum dengan "B". Ini pola “tumbuhkan satu fungsi umum, lalu bungkus jadi yang khusus”. Loopnya mulai dari 0 dan berhenti sebelum string.length, karena posisi karakter mulai dari 0.

→ Soal: 03 Latihan Fungsi > 3.3 Menghitung Karakter