Lewati ke isi
JRG++JRG++ v0.2.0

JRG 6 · Dasar JRG

Fungsi

Memberi nama pada sepotong pekerjaan, supaya bisa dipanggil berulang kali tanpa menyalin satu baris pun.

strukturBentuk dasar

fungsi.jrg
fn luasPersegi(sisi: int) -> int {
    return sisi * sisi
}

pub fn main() {
    wok(luasPersegi(5))
    wok(luasPersegi(12))
}
25
144
BagianArtinya
fnKata kunci pembuka fungsi
luasPersegiNama — sebaiknya kata kerja atau menjelaskan hasilnya
(sisi: int)Parameter: nilai yang diterima dari pemanggil
-> intTipe nilai yang dikembalikan
returnNilai yang diserahkan kembali

Beberapa parameter

param.jrg
fn luasSegitiga(alas: float, tinggi: float) -> float {
    return 0.5 * alas * tinggi
}

fn keliling(p: int, l: int) -> int {
    return 2 * (p + l)
}

pub fn main() {
    wok("Luas segitiga:", luasSegitiga(10.0, 6.0))
    wok("Keliling:", keliling(7, 4))
}
Luas segitiga: 30.0
Keliling: 22

Nilai bawaan parameter

Parameter boleh punya nilai cadangan. Kalau pemanggil tidak mengisinya, yang dipakai nilai itu.

bawaan.jrg
fn sapa(nama: string, salam: string = "Halo") -> string {
    return salam + ", " + nama + "!"
}

pub fn main() {
    wok(sapa("Sari"))
    wok(sapa("Budi", "Selamat pagi"))
}
Halo, Sari!
Selamat pagi, Budi!

Fungsi tanpa nilai kembali

Tidak semua fungsi menghasilkan nilai. Sebagian hanya melakukan sesuatu — mencetak, misalnya.

tanpa-return.jrg
fn cetakGaris() {
    wok("------------------------")
}

fn cetakJudul(teks: string) {
    cetakGaris()
    wok(teks)
    cetakGaris()
}

pub fn main() {
    cetakJudul("Laporan Nilai")
}
------------------------
Laporan Nilai
------------------------

Fungsi memanggil fungsi

Fungsi boleh memanggil fungsi lain, termasuk dirinya sendiri. Yang terakhir itu disebut rekursi.

rekursi.jrg
fn faktorial(n: int) -> int {
    if n <= 1 { return 1 }
    return n * faktorial(n - 1)
}

pub fn main() {
    for _, i in 1..=6 {
        wok(i, "! =", faktorial(i))
    }
}
1 ! = 1
2 ! = 2
3 ! = 6
4 ! = 24
5 ! = 120
6 ! = 720

Urutan penulisan tidak mengikat

Fungsi boleh dipanggil sebelum baris deklarasinya. JRG membaca seluruh berkas dulu, baru menjalankan main.

urutan-fn.jrg
pub fn main() {
    wok(dua(21))       // dipanggil sebelum ditulis
}

fn dua(n: int) -> int {
    return n * 2
}
42

Anotasi tipe tidak memaksa

Seperti di JRG 2: nama tipenya diperiksa, nilainya tidak. Fungsi bertanda float tetap menerima int.

longgar.jrg
fn setengah(x: float) -> float {
    return x / 2.0
}

pub fn main() {
    wok(setengah(9.0))
    wok(setengah(9))     // int diterima juga
}
4.5
4.5

Kuis 1

Apa gunanya return?

Kuis 2

Kenapa fungsi rekursif perlu syarat berhenti?

Kuis 3

Bisakah fungsi dipanggil di baris sebelum ia ditulis?

Latihan mandiri

1. Buat fungsi kubik(n) yang mengembalikan n³.

2. Buat fungsi maksimum(a, b) tanpa memakai math::max.

3. Buat fungsi rekursif yang menjumlahkan 1 sampai n.

Jawaban 1: return n * n * n, atau return n ** 3.
Jawaban 2: if a > b { return a } lalu return b.
Jawaban 3: if n <= 0 { return 0 } lalu return n + jumlah(n - 1).