Cara bermain Boneka Matryoshka
- Baca instruksi level. Nama dan parameter fungsinya sudah tertulis di atas editor, kamu cukup mengisi badannya.
- Ubah kode di editor. Kodemu langsung dijalankan dengan beberapa kasus uji, dan arena memutar tumpukan panggilan kasus yang dipilih sekali, dari panggilan pertama sampai nilai terakhir kembali.
- Klik kasus lain di atas arena untuk melihat jejak panggilannya. Kasus bertanda ✗ adalah yang belum sesuai. Tombol Lewati animasi langsung menampilkan keadaan akhirnya.
- Tekan Cek jawaban atau Ctrl + Enter. Semua kasus harus kembali dengan nilai yang benar, dan fungsimu harus benar-benar memanggil dirinya sendiri.
- Rekursi yang tidak berhenti dihentikan dengan aman setelah 500 lapis, jadi tab tidak macet.
- Kalau buntu, buka Petunjuk. Level yang sudah selesai tetap tercentang di browser yang sama.
Yang kamu pelajari
- Level 1
Kasus dasar
Kondisi yang langsung mengembalikan jawaban tanpa memanggil lagi, misalnya boneka yang
isi-nyanull. - Level 2
Nilai yang dibawa kembali
Tiap lapis memakai nilai dari panggilan di dalamnya, lalu menambahkan bagiannya sendiri sebelum
return. - Level 3
Stack overflow
Tanpa kasus dasar, panggilan menumpuk terus sampai call stack habis dan JavaScript melempar
RangeError. - Level 4
Langkah yang mengecil
Argumen tiap panggilan harus lebih dekat ke kasus dasar, misalnya
n - 1. Kalau tidak, kasus dasar tidak pernah tercapai. - Level 5
Urutan turun dan kembali
Kode sebelum panggilan rekursif jalan saat turun, kode sesudahnya jalan saat kembali. Posisinya menentukan urutan hasil.
- Level 6
Array bersarang
Satu panggilan bisa memanggil dirinya beberapa kali, sekali untuk tiap kotak di dalamnya.
- Level 7
Meratakan array
Hasil dari tiap kotak di dalam disatukan ke array milik panggilan ini dengan spread.
- Level 8
Objek bersarang
Data berbentuk pohon (
isiberupa array objek). Kasus dasarnya tersembunyi: loop atas array kosong tidak memanggil apa pun. - Level 9
Menggabungkan cabang
Hasil beberapa cabang digabung sesuai pertanyaannya: dijumlah untuk menghitung,
Math.maxuntuk mencari yang terdalam. - Level 10
Berhenti lebih awal
Begitu satu cabang menemukan jawaban, hasilnya diteruskan ke atas dan cabang lain tidak perlu diperiksa.
Tiap panggilan punya bonekanya sendiri
Saat hitung(Ibu) memanggil hitung(Kakak), panggilan pertama belum selesai. Ia menunggu di call stack dengan variabel dan parameternya sendiri, sementara panggilan baru dibuka di atasnya. Baru setelah hitung(Adik) mengembalikan 1, Kakak bisa menghitung 1 + 1, lalu Ibu menghitung 1 + 2.
Jadi rekursi selalu punya dua arah. Saat turun, masalahnya dibuat lebih kecil sampai ketemu kasus dasar. Saat kembali, jawaban kecil itu dibawa naik dan dilengkapi di tiap lapis. Kalau kasus dasar tidak pernah tercapai, tumpukan terus bertambah sampai RangeError: Maximum call stack size exceeded.
Tanya jawab
Apakah harus daftar akun untuk bermain?
Tidak. Semua level bisa dimainkan tanpa akun. Kemajuanmu disimpan di browser yang kamu pakai, jadi akan hilang kalau data browser dihapus.
Di mana kodeku dijalankan?
Di Web Worker di dalam iframe terpisah, bukan di halaman ini. Kodemu tidak bisa membaca cookie atau data Mahir, dan perulangan yang tidak berhenti dihentikan setelah 1 detik.
Bagaimana game ini mencatat tiap panggilan?
Setelah fungsimu dibuat, game membungkusnya dengan pencatat di nama yang sama. Panggilan rekursif di dalam badan fungsimu ikut lewat pencatat itu, jadi kedalaman, argumen, dan nilai kembali tiap panggilan tercatat tanpa kamu menulis apa pun.
Apa yang terjadi kalau rekursiku tidak pernah berhenti?
Pencatat menghentikannya di lapis ke-500 dan arena menandai kasus itu meluap. RangeError asli dari browser juga ditangkap dengan cara yang sama, jadi tab tetap jalan.
Kenapa jawaban dengan loop atau flat(Infinity) ditolak?
Hasilnya memang benar, tapi game ini melatih rekursi, jadi fungsinya harus memanggil dirinya sendiri minimal satu lapis. Di kode sungguhan, loop atau flat(Infinity) sering pilihan yang lebih baik untuk data yang dangkal.