Modul 3: Fungsi dan Rekursi - Algoritma-dan-Pemrograman-ITS/DasarPemrograman GitHub Wiki

Daftar Isi


Fungsi

Pengenalan Fungsi

Fungsi adalah sebuah kumpulan statement untuk melakukan tugas spesifik, yang bisa membutuhkan input ataupun tidak, untuk menghasilkan output yang sesuai.

Secara umum, fungsi dibedakan menjadi dua, yakni fungsi Standard Library dan fungsi yang dibuat pengguna. Fungsi Standard Library adalah fungsi bawaan yang telah disertakan dalam library standar, misal fungsi printf(), scanf() yang ada di dalam library <stdio.h>. Sedangkan fungsi yang dibuat oleh pengguna (user-defined) adalah fungsi yang sengaja dibuat oleh pengguna untuk memenuhi keperluan pengguna dalam membuat program.

Tujuan Fungsi

Tujuan dibuatnya fungsi secara umum adalah untuk membuat program menjadi lebih modular. Fungsi digunakan ketika ingin menjalankan serangkaian perintah secara berulang kali, terkadang dengan input yang berbeda, dengan tujuan tidak mengulang penulisan kode berkali-kali, serta apabila nantinya program mengalami bug akan mempermudah proses perbaikan.

Pendefinisian Fungsi

Sebelum fungsi dapat digunakan dan bisa dipanggil, perlu dilakukan pendefinisan terlebih dahulu. Pendefinisian ditujukan untuk mendefinisikan apa yang fungsi tersebut lakukan ketika fungsi tersebut dipanggil.

Berikut adalah sintaks untuk melakukan pendefinisan fungsi:

<return_type> <nama_fungsi>(<parameter1>, <parameter2>, ...)
{
    statement;
    statement;
    ...
    ...
    ...
}

Berikut adalah contoh fungsi untuk mencetak string "Aku Sebuah Fungsi.":

void cetak()
{
    printf("Aku Sebuah Fungsi\n");
}
 
int main()
{
    cetak();
    return 0;
}

Prototipe Fungsi

Selain menggunakan pendefisian langsung seperti cara sebelumnya, fungsi juga dapat dibuat dengan prototipe. Prototipe fungsi (atau biasa disebut interface fungsi) adalah deklarasi dari sebuah fungsi tanpa definisinya. Deklarasi sebuah fungsi berisi return type, nama fungsi, dan parameter yang terlibat.

Untuk menuliskan prototipe fungsi, sintaksnya sebagai berikut:

// Deklarasi
<return_type> <nama_fungsi>(<parameter1>, <parameter2>, ...);

Contoh kode program menggunakan prototipe fungsi:

// Prototipe Fungsi
void cetak();
 
int main()
{
    cetak();
    return 0;
}
 
// Definisi Fungsi cetak()
void cetak()
{
    printf("Aku Sebuah Fungsi\n");
}

Parameter Fungsi

Parameter pada fungsi bersifat layaknya input yang diberikan kepada sebuah fungsi. Jumlah parameter pada sebuah fungsi bisa dibuat sebanyak-banyaknya sesuai kebutuhan.

Penulisan parameter fungsi sama dengan pendefinisian variabel dan tiap parameter dipisahkan oleh operator (,).

<tipe_data> <nama_parameter_1> , <tipe_data> <nama_parameter_2>, ...

Contoh:

void cetak(char str[])
{
    printf("%s\n", str);
}
 
void jumlah(int a, int b)
{
    int hasil = a + b;
    printf("%d\n", hasil);
}

Pemanggilan Fungsi

Untuk memanggil fungsi, dilakukan dengan menulis nama fungsinya diikuti dengan tanda (). Apabila fungsi tersebut memiliki parameter maka di dalam tanda () dituliskan nilai/variabel/objek untuk dijadikan yang kita sebut dengan argumen dan dipisahkan tiap argumen dengan operator ,. Argumen-argumen yang dimasukkan harus sesuai dengan tipe data parameter fungsinya.

Contoh pemanggilan fungsi:

int main()
{
    cetak();
    tambahkan(2,5);
    cetak("Halo, dunia");
}

Nilai return Fungsi

Jika kita menginginkan fungsi yang kita jalankan menghasilkan sebuah nilai atau sederhananya menghasilkan sebuah output, kita bisa menambahkan keyword return dan mendefinisikan return type dari fungsi tersebut. Fungsi yang memiliki return type bukan void pasti memiliki return value. Nilai yang dikembalikan oleh fungsi tersebut memiliki tipe data yang bersesuaian dengan return type-nya.

Saat menemui statement return pada fungsi, maka fungsi tersebut akan berhenti dari titik dimana return tersebut terdapat, kemudian kembali ke bagian kode yang memanggil fungsi tersebut.

Misal kita ingin mendapatkan hasil dari penjumlahan dua bilangan menggunakan fungsi bernama jumlah().

#include <stdio.h>
 
int jumlah(int a, int b);
 
int main()
{
    int x = 2, y = 3, hasil;
    hasil = jumlah(x, y);
    printf("%d\n", hasil);
    return 0;
}
 
int jumlah(int a, int b)
{
    int hasil = a;
    hasil += b;
    return hasil;
}

Fungsi Rekursif

Pengenalan Rekursi

Rekursi merujuk kepada definisi suatu hal yang dilakukan secara berulang-ulang.

image

Gambar diatas juga merupakan salah satu representasi definisi dari rekursi. Di dalam dunia pemrograman istilah rekursi digunakan untuk menggambarkan fungsi yang bersifat rekursif.

Fungsi yang bersifat rekursif adalah fungsi yang memanggil dirinya sendiri didalam fungsi tersebut. Perhatikan contoh program di bawah:

#include <stdio.h>
 
void rekursi(int n)
{
    printf("%d\n", n);
    rekursi(n+1);       // memanggil dirinya sendiri
}
 
int main()
{
    rekursi(1);
    return 0;
}

Fungsi rekursi() merupakan fungsi yang bersifat rekusif karena didalamnya memanggil fungsi rekursi() itu sendiri.

Recursive Case dan Base Case

Program sebelumnya akan terus mencetak tanpa henti karena fungsi tersebut tidak tahu kapan dirinya harus berhenti untuk memanggil dirinya sendiri. Karena dari itu kita perlu base case pada sebuah fungsi rekursif.

Base Case adalah sebuah kasus atau kondisi yang kita berikan kepada sebuah fungsi rekursif untuk berhenti memanggil dirinya lagi atau disebut juga terminating condition.

Recursive Case adalah kasus dimana sebuah fungsi diharuskan untuk memanggil dirinya sendiri, dalam kata lain sebuah fungsi tersebut belum mencapai base case-nya.

Kita ambil contoh fungsi rekursif untuk memangkatkan suatu bilangan bulat. Didefinisikan perpangkatan sebuah bilangan a pangkat m sebagai power(a, m), berarti dapat dituliskan:

Atau dapat didefinisikan sebagai fungsi rekursif:

Dengan base case-nya adalah:

Dapat diperhatikan bahwa base case dari fungsi power(a, m) adalah ketika power(a, 0) yang menghasilkan 1. Ketika sudah mencapai base case, maka tidak perlu melakukan pemanggilan fungsi itu lagi.

#include <stdio.h>
 
int power(int a, int m)
{
    if (m == 0) return 1;       // base case
    return (a * power(a, m-1)); // recursive case
}
 
int main()
{
    printf("%d\n", power(2,3));
    return 0;
}

Soal Latihan

Soal 1

Buatlah program yang mengimplementasikan fungsi rekursif untuk menentukan nilai dari N! (N faktorial).

Contoh Input

5

Contoh Output

120

Soal 2

Diberikan sebuah baris bilangan 1, 5, 14, 30, ... dst. Buatlah sebuah program yang mengimplementasikan fungsi rekursif untuk menentukan bilangan ke-n dari pola tersebut.

Contoh Input

2

Contoh Output

5

Soal 3

Buatlah program yang mengimplementasikan fungsi untuk menentukan bilangan terbesar dan terkecil dari array A dengan N bilangan.

Contoh Input

5
1 2 3 4 5

Contoh Output

max: 5
min: 1
⚠️ **GitHub.com Fallback** ⚠️