Function dan Rekursi

Function atau fungsi merupakan bagian yang sangat penting dalam bahasa C++ maupun bahasa pemrograman lain. Saat membuat program dengan bahasa C++, kalian minimal akan membutuhkan function utama. Selain itu, kalian juga memerlukan function lain untuk meminta input, menampilkan output, dan untuk mengolah variabel berdasarkan rumus tertentu.

Selain function utama dan function bawaan header C++, kalian juga bisa membuat function kalian sendiri. Function bisa berisi sekumpulan statement, atau algoritma tertentu. Setelah dibuat, function bisa digunakan berkali-kali untuk mengerjakan tugas yang sama. Untuk menulis function, kalian bisa menuliskannya dengan sintaks-sintaks seperti di bawah ini.

  • tipe_data_kembalian nama_function(){//isifunction}
  • tipe_data_kembalian nama_function(tipe_data parameter){//isifunction}
  • tipe_data_kembalian nama_function(tipe_data parameter1, tipe_data parameter2, ...){//isifunction}
Contoh :
void functionku(string kata){
    cout << kata;
}

Variabel kata yang terdapat di dalam tanda kurung disebut dengan parameter. Parameter akan diganti dengan angka, nama variabel, atau nilai lain saat pemanggilan function.

Pemanggilan function

Kalian bisa menggunakan function di dalam program utama atau function lain. Penggunaan function disebut juga dengan "pemanggilan function". Function dipanggil dengan menulis nama function dan menyertakan argumen. Argumen adalah nilai yang diberikan saat pemanggilan function untuk disimpan ke dalam parameter sebelum diproses di dalam function.
#include <iostream>

using namespace std;

void functionku(string kata){
    cout << kata;
}

int main(){
    string s;
    cout << "Input : ";getline(std::cin, s);
    cout << "kalimat : ";functionku(s);
}
Contoh Program :
Input : Nama saya Geri.
kalimat : Nama saya Geri.

Function bisa memiliki beberapa parameter jika dibutuhkan. Function juga bisa tidak memiliki parameter jika memang tidak diperlukan.

Function pada contoh di atas hanya menggunakan satu parameter. Saat pemanggilan, parameter tersebut menerima nilai variabel s sebagai argumen. Nilai variabel disalin ke parameter "kata" sebelum diproses oleh function. 

Function pada contoh di atas mencetak nilai argumen yang disalin ke parameter kata dengan menggunakan cout.

Nilai Kembalian

Variabel yang dideklarasikan di dalam function disebut dengan variabel lokal. Nilai variabel yang dideklarasikan di dalam function hanya bisa digunakan di dalam function tersebut. Untuk mengembalikan nilai salah satu variabel supaya bisa digunakan dalam lingkup fungsi lain, kalian perlu menggunakan return.

Function dengan tipe void tidak bisa menggunakan return. Kalian harus menggunakan tipe data lain supaya bisa menggunakan return. Contoh penggunaannya bisa kalian lihat di bawah ini.

#include <iostream>

using namespace std;

int luas_persegi_panjang(int p, int l){
    int Luas;
    Luas=p*l;
    return Luas;
}

int main(){
    int p, l;
    cout << "panjang : ";cin >> p;
    cout << "lebar : "; cin >> l;
    cout << "luas : ";
    cout << luas_persegi_panjang(p, l);
    return 0;
}
Contoh Program :
panjang : 25
lebar : 23
luas : 575

Kalian bisa mengembalikan nilai untuk disimpan maupun langsung dicetak. Kalian juga bisa menggunakan operasi aritmetika sebagai nilai kembalian. Kode program di bawah ini, hasilnya sama dengan kode program di atas.

#include <iostream>

using namespace std;

int luas_persegi_panjang(int p, int l){
    return p*l;
}

int main(){
    int p, l, Luas;
    cout << "panjang : ";cin >> p;
    cout << "lebar : "; cin >> l;

    Luas=luas_persegi_panjang(p, l);

    cout << "luas : ";
    cout << Luas;
    return 0;
}

Contoh di atas, mengembalikan hasil perkalian panjang kali lebar di dalam function ke dalam variabel Luas sebelum dicetak dengan cout.

Selain mengembalikan nilai, return juga digunakan untuk keluar dari function. Saat kalian menggunakan return, statement-statement di bawah return akan diabaikan. Kalau mau aman, letakkan return di akhir function.

Prototype Function

Prototype function adalah deklarasi function tanpa statement. Prototype digunakan untuk menghubungkan kode program dengan function di dalam library atau file lain. Selain itu, kalian juga kadang perlu prototype di satu file kalau function yang kalian panggil ada di bawah function tempat kalian memanggil function tersebut.

#include <iostream>

using namespace std;

void fungsiku(int par1, string par2);

int main(){
    fungsiku(1, "Hello, prototype!");
    return 0;
}

void fungsiku(int par1, string par2){
    cout << par1<< "." << par2;
}
Contoh Program :
1.Hello, prototype!

Nama parameter di dalam prototype tidak mutlak penulisannya. Kalian bisa menulis prototype tanpa parameter seperti di bawah ini.

void fungsiku(int, string);
Saat kalian tidak menggunakan prototype, "pemanggilan function ke depan" seperti contoh di atas mungkin saja akan memicu error. Function perlu dipindah ke atas function main supaya kalian bisa memanggilnya tanpa prototype.

Rekursi

Rekursi adalah pemanggilan function oleh dirinya sendiri. Contoh rekursi bisa kalian lihat di bawah ini.

#include <iostream>

using namespace std;

int fungsi_rekursi(int i){
	cout << "i : " << i << endl;
	
	if(i<5)fungsi_rekursi(i+1);
	else cout << "selesai" << endl;
	
	cout << "i : " << i << endl;
	
	return 0;
}
int main(){
    fungsi_rekursi(0);
	return 0;
}
Contoh Program :
i : 0
i : 1
i : 2
i : 3
i : 4
i : 5
selesai
i : 5
i : 4
i : 3
i : 2
i : 1
i : 0
Contoh di atas mencetak nilai i dengan "cout yang pertama" sebelum function ( fungsi_rekursi ) memanggil dirinya sendiri. Saat function dipanggil, statement yang berada di bawahnya akan dilewati sampai rekursi berakhir karena kondisi ( i < 5 ) terpenuhi. Setelah itu, program akan menampilkan "selesai" sebelum kembali ke fungsi yang dipanggil sebelumnya.

Function akan menampilkan nilai i dengan "cout yang kedua" untuk menampilkan nilai variabel i mulai dari function yang dipanggil terakhir hingga berbalik ke pemanggilan pertama. Karena itu, angka yang dicetak setelah "selesai" urutannya terbalik jika dibandingkan dengan yang pertama walaupun nilai parameternya adalah "i+1".

Rekursi VS Loop

Kalian mungkin melihat adanya kemiripan hasil dari rekursi dengan loop. Rekursi akan terlihat seperti loop jika function hanya dipanggil sekali di awal atau akhir function. Tapi, loop dan rekursi tidak bisa disamakan karena tidak ada yang namanya "rekursi tanpa akhir" jika rekursinya berjalan linear seperti loop.

Rekursi punya batas karena function perlu alokasi memori untuk parameter dan variabel lokal setiap kali function dipanggil. Memori akan dibersihkan saat function selesai.

Saat function dipangil secara rekursif berkali-kali tanpa ujung, memori komputer akan penuh, dan memicu error ( segmentation fault ). Rekursi perlu kembali ke pemanggilan pertama untuk membersihkan semua memori yang terpakai.

Rekursi perlu loop atau percabangan untuk membatasi pemanggilan fungsi. Kalau kalian menghapus if pada contoh rekursi di atas, rekursi akan dipanggil sampai muncul error karena kekurangan memori.

Lambda Expression

Lambda expression adalah function yang bisa disimpan ke dalam variabel. Function ini juga tidak memiliki namanya sendiri sehingga harus disimpan ke dalam variabel. Di bahasa pemrograman lain, function tersebut ditujukan untuk menulis function yang isinya cuma satu baris. Syntaks lambda bisa kalian lihat di bawah ini.

  • variabel = [](){statement;statement;return}

Lambda function bisa dipanggil dengan nama variabelnya.

#include <iostream>

using namespace std;

int main(int argc, char *argv[]){
    auto functionku=[](string s){
	cout << s << endl;
    };
    
    return 0;
    functionku("Test");
}