Prasyarat dan pemilihan bahasa

Kesiapan fungsi, perulangan, dan rekursi pada Python serta Java, beserta cara memilih bahasa latihan.

Daftar isi

Latihan DSA menuntut penguasaan dasar bahasa pemrograman yang tidak seluas yang sering dibayangkan, tetapi daftarnya perlu dipegang jelas. Topik ini memeriksa kesiapan fungsi, perulangan, percabangan, dan rekursi dasar, lalu membandingkan Python dan Java sebagai dua pilihan bahasa latihan yang paling lazim. Satu fungsi rekursif sederhana ditulis dan dijalankan pada kedua bahasa, lengkap dengan keluaran aslinya. Topik ditutup dengan saran praktis memilih satu bahasa utama dan satu bahasa kedua sebagai pembanding.

Kesiapan yang dituntut#

Empat kemampuan berikut menjadi pintu masuk yang cukup untuk seluruh jalur ini. Sebelum mulai, periksa satu per satu apakah tiap kemampuan sudah dapat dipraktikkan tanpa membuka catatan.

  1. Fungsi, yakni kemampuan mendefinisikan blok kode dengan parameter, mengembalikan nilai lewat return, dan memanggil fungsi tersebut dari tempat lain.
  2. Perulangan, yakni kemampuan menulis for dan while untuk mengunjungi setiap elemen array atau mengulang langkah sampai kondisi berubah.
  3. Percabangan, yakni kemampuan memakai if, elif atau else if, dan else untuk menangani kasus berbeda pada data yang sama.
  4. Rekursi dasar, yakni kemampuan menulis fungsi yang memanggil dirinya sendiri beserta kondisi berhentinya.

Kemampuan keempat biasanya yang paling belum mantap, dan itu wajar. Rekursi baru terasa alami setelah beberapa implementasi sederhana berhasil dijalankan, sehingga jalur ini mengalokasikan satu modul penuh untuk memperdalamnya. Yang dibutuhkan sekarang hanya pengakuan bentuknya, yaitu fungsi dengan kasus dasar yang mengembalikan nilai tanpa pemanggilan lagi dan kasus rekursif yang mengecilkan masalah.

Kemampuan di luar daftar tidak dituntut. Pemahaman kelas (class), pointer, atau analisis kompleksitas formal akan dibangun dari nol pada waktunya. Jika tiga kemampuan pertama sudah lancar pada satu bahasa apa pun, latihan DSA dapat dimulai, sedangkan kemampuan keempat terasah seiring latihan pada jalur ini.

Perbandingan Python dan Java#

Python dan Java sama-sama diterima di judge daring dan sama-sama memadai untuk seluruh latihan pada jalur ini. Perbedaannya terletak pada pengalaman menulis dan mengeksekusinya, sebagaimana dirangkum tabel berikut.

AspekPythonJava
Keringkasan sintaksringkas, tanpa deklarasi tipe dan tanpa kurung kurawallebih panjang, tipe harus dideklarasikan dan blok memakai kurung kurawal
Pengecekan tipedinamis, tipe diperiksa saat program berjalanstatis, tipe diperiksa saat kompilasi sebelum program berjalan
Koleksi bawaanlist, dict, dan set siap pakai sebagai bagian bahasakeluarga koleksi tersedia di Java Collections Framework, misalnya ArrayList, HashMap, dan HashSet
Kecepatan eksekusilebih lambat karena ditafsirkan saat berjalanlebih cepat karena dikompilasi sebelum berjalan

Perbedaan keringkasan paling terasa pada kode harian latihan. Solusi Python biasanya dua sampai tiga kali lebih pendek daripada padanannya di Java, sehingga draf pertama selesai lebih cepat dan konsentrasi tetap pada logika algoritma. Kecepatan eksekusi Java memberi keuntungan pada masukan yang sangat besar, tetapi judge daring hampir selalu menyetel batas waktunya per bahasa, sehingga solusi Python yang tepat tetap lolos. Keunggulan kecepatan ini muncul karena Java dikompilasi ke bytecode, yakni kode antara yang dijalankan oleh mesin virtual bernama JVM, sedangkan Python ditafsirkan baris demi baris saat program berjalan. Untuk belajar, kejelasan logika jauh lebih menentukan daripada detik eksekusi.

Pengecekan tipe memberi manfaat yang berbeda arah. Pengetikan statis Java menangkap kecerobohan tipe sebelum program berjalan, sementara pengetikan dinamis Python mempercepat eksperimen karena satu baris dapat langsung diuji. Keduanya adalah trade-off yang wajar, dan pengalaman pada keduanya membuat pembacaan kode orang lain di kedua dunia menjadi hal biasa.

Satu fungsi rekursif dalam dua bahasa#

Faktorial dipilih sebagai contoh rekursi pertama karena bentuknya kecil, tetapi sudah memuat kedua bagian pentingnya, yaitu kasus dasar dan kasus rekursif. Rumusnya tertulis

n!=n×(n−1)×(n−2)×⋯×1 n! = n \times (n-1) \times (n-2) \times \cdots \times 1

dengan kasus dasar 0!=1!=10! = 1! = 1. Versi Python berikut mendefinisikan fungsi faktorial, lalu mencetak nilainya untuk 0 sampai 7.

python faktorial.py
def faktorial(n):
    if n <= 1:
        return 1
    return n * faktorial(n - 1)

for i in range(8):
    print(f"{i}! = {faktorial(i)}")
text Keluaran
0! = 1
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040

Cara kerjanya terlihat jelas pada pemanggilan faktorial(5). Fungsi memanggil faktorial(4), yang memanggil faktorial(3), dan seterusnya sampai masukan mencapai kasus dasar n <= 1. Hasil kemudian dikembalikan berlapis, yaitu 2 dikali 1, lalu 3 dikali hasil itu, sampai perkalian paling luar selesai. Tumpukan pemanggilan yang belum selesai ini disimpan oleh call stack, yakni struktur tumpukan yang menjadi ruang kerja setiap pemanggilan fungsi.

Versi Java memakai struktur yang sama. Nama berkasnya Faktorial.java dan nama kelas publiknya Faktorial, karena Java mengharuskan keduanya sama. Fungsi faktorial ditulis sebagai static method agar dapat dipanggil dari main tanpa membuat objek.

java Faktorial.java
public class Faktorial {

    static int faktorial(int n) {
        if (n <= 1) {
            return 1;
        }
        return n * faktorial(n - 1);
    }

    public static void main(String[] args) {
        for (int i = 0; i < 8; i++) {
            System.out.println(i + "! = " + faktorial(i));
        }
    }
}
text Keluaran
0! = 1
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040

Kedua keluaran identik, dan persis itulah intinya. Logika rekursi milik algoritma, bukan milik bahasa, sehingga keterampilan yang dibangun pada satu bahasa dapat dipindahkan ke bahasa lain dengan mengganti lapisan sintaksnya saja.

Memilih bahasa utama#

Saran praktisnya sederhana, yaitu pilih satu bahasa utama dan pertahankan sepanjang jalur. Kriteria pemilihannya dapat dirangkum menjadi tiga pertanyaan. Pertama, bahasa apa yang sudah paling lancar dipakai hari ini, karena berpindah bahasa sekaligus belajar algoritma menumpuk dua beban pada satu waktu. Kedua, bahasa apa yang lazim pada lowongan atau lingkungan kerja yang dituju, karena kefasihan tetap membantu meskipun wawancara biasanya memperbolehkan memilih bahasa apa pun. Ketiga, seberapa nyaman menulis kode yang lebih panjang, karena memilih Java berarti menerima sintaks yang lebih bertingkat.

Bahasa kedua tetap berguna sebagai pembanding, dengan porsi kecil. Setiap kali satu pola selesai dikuasai pada bahasa utama, padanannya ditulis ulang pada bahasa kedua. Penulisan ulang itu menguji apakah yang dipelajari adalah pola atau hanya sintaks. Faktorial pada bagian sebelumnya memberi contoh pola itu, yaitu kasus dasar dan kasus rekursif yang identik di kedua sisi. Yang perlu dihindari adalah mengganti bahasa utama di tengah jalur, karena kemajuan latihan menjadi sulit diukur.

Ringkasan#

  • Prasyarat latihan DSA berupa fungsi, perulangan, percabangan, dan rekursi dasar, tanpa tuntutan penguasaan kelas maupun analisis formal.
  • Python unggul pada keringkasan dan koleksi bawaan, sedangkan Java unggul pada pengetikan statis dan kecepatan eksekusi.
  • Fungsi faktorial rekursif menghasilkan keluaran yang identik di Python dan Java, sehingga logika algoritma terbukti dapat dipindahkan antar bahasa.
  • Pilih satu bahasa utama dan pertahankan sepanjang jalur, lalu gunakan bahasa kedua hanya sebagai pembanding pada porsi kecil.

Referensi#