JRG 6 · Dasar JRG
Fungsi
Memberi nama pada sepotong pekerjaan, supaya bisa dipanggil berulang kali tanpa menyalin satu baris pun.
strukturBentuk dasar
fn luasPersegi(sisi: int) -> int {
return sisi * sisi
}
pub fn main() {
wok(luasPersegi(5))
wok(luasPersegi(12))
}25
144| Bagian | Artinya |
|---|---|
fn | Kata kunci pembuka fungsi |
luasPersegi | Nama — sebaiknya kata kerja atau menjelaskan hasilnya |
(sisi: int) | Parameter: nilai yang diterima dari pemanggil |
-> int | Tipe nilai yang dikembalikan |
return | Nilai yang diserahkan kembali |
Beberapa parameter
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: 22Nilai bawaan parameter
Parameter boleh punya nilai cadangan. Kalau pemanggil tidak mengisinya, yang dipakai nilai itu.
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.
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.
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 ! = 720Urutan penulisan tidak mengikat
Fungsi boleh dipanggil sebelum baris deklarasinya. JRG membaca seluruh berkas dulu, baru menjalankan main.
pub fn main() {
wok(dua(21)) // dipanggil sebelum ditulis
}
fn dua(n: int) -> int {
return n * 2
}42Anotasi tipe tidak memaksa
Seperti di JRG 2: nama tipenya diperiksa, nilainya tidak. Fungsi bertanda float tetap menerima int.
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.5Kuis 1
Apa gunanya return?
Tepat — dan ia sekaligus mengakhiri fungsi, jadi baris di bawahnya tidak dikerjakan.
return tidak mencetak apa pun; yang mencetak adalah wok.
Kuis 2
Kenapa fungsi rekursif perlu syarat berhenti?
Betul. Tanpa itu pemanggilan menumpuk sampai batas kedalaman tercapai.
Pikirkan apa yang terjadi kalau fungsi selalu memanggil dirinya.
Kuis 3
Bisakah fungsi dipanggil di baris sebelum ia ditulis?
Tepat.
Coba jalankan contoh 'urutan-fn.jrg' di atas — ia berjalan normal.
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.
return n * n * n, atau return n ** 3.if a > b { return a } lalu return b.if n <= 0 { return 0 } lalu return n + jumlah(n - 1).