Grafik perbandingan
Dasar untuk perbandingan | Rekursi | Perulangan |
---|---|---|
Dasar | Pernyataan dalam tubuh fungsi memanggil fungsi itu sendiri. | Mengizinkan kumpulan instruksi dieksekusi berulang kali. |
Format | Dalam fungsi rekursif, hanya kondisi terminasi (base case) yang ditentukan. | Iterasi termasuk inisialisasi, kondisi, eksekusi pernyataan dalam loop dan pembaruan (kenaikan dan penurunan) variabel kontrol. |
Penghentian | Pernyataan bersyarat disertakan dalam tubuh fungsi untuk memaksa fungsi kembali tanpa panggilan rekursi dieksekusi. | Pernyataan iterasi berulang kali dieksekusi sampai kondisi tertentu tercapai. |
Kondisi | Jika fungsi tidak konvergen ke beberapa kondisi yang disebut (kasus dasar), itu menyebabkan rekursi tak terbatas. | Jika kondisi kontrol dalam pernyataan iterasi tidak pernah menjadi salah, itu mengarah ke iterasi tak terbatas. |
Pengulangan Tanpa Batas | Rekursi tak terbatas dapat merusak sistem. | Infinite loop menggunakan siklus CPU berulang kali. |
Terapan | Rekursi selalu diterapkan pada fungsi. | Iterasi diterapkan pada pernyataan iterasi atau "loop". |
Tumpukan | Stack digunakan untuk menyimpan set variabel lokal baru dan parameter setiap kali fungsi dipanggil. | Tidak menggunakan tumpukan. |
Atas | Rekursi memiliki overhead panggilan fungsi yang berulang. | Tidak ada overhead panggilan fungsi berulang. |
Kecepatan | Lambat dalam eksekusi. | Eksekusi cepat. |
Ukuran Kode | Rekursi mengurangi ukuran kode. | Iterasi membuat kode lebih lama. |
Definisi Rekursi
C ++ memungkinkan suatu fungsi untuk memanggil dirinya sendiri dalam kodenya. Itu berarti definisi fungsi memiliki pemanggilan fungsi untuk dirinya sendiri. Kadang-kadang juga disebut " definisi melingkar ". Rangkaian variabel dan parameter lokal yang digunakan oleh fungsi baru dibuat setiap kali fungsi memanggil dirinya dan disimpan di bagian atas tumpukan. Tetapi, setiap kali suatu fungsi memanggil dirinya sendiri, ia tidak membuat salinan baru dari fungsi itu. Fungsi rekursif tidak secara signifikan mengurangi ukuran kode dan bahkan tidak meningkatkan pemanfaatan memori, tetapi beberapa ketika dibandingkan dengan iterasi.
Untuk mengakhiri rekursi, Anda harus menyertakan pernyataan pilih dalam definisi fungsi untuk memaksa fungsi kembali tanpa memberikan panggilan rekursif untuk dirinya sendiri. Tidak adanya pernyataan pilih dalam definisi fungsi rekursif akan membiarkan fungsi dalam rekursi tak terbatas pernah disebut.
Mari kita memahami rekursi dengan fungsi yang akan mengembalikan faktorial angka tersebut.
int factorial (int num) {int answer; if (num == 1) {return 1; } else {answer = factorial (num-1) * num; // panggilan rekursif} kembali (jawab); }
Dalam kode di atas, pernyataan di bagian lain menunjukkan rekursi, seperti pernyataan yang memanggil fungsi faktorial () di mana ia berada.
Definisi Iterasi
Iterasi adalah proses mengeksekusi set instruksi berulang kali sampai kondisi dalam pernyataan iterasi menjadi salah. Pernyataan iterasi termasuk inisialisasi, perbandingan, pelaksanaan pernyataan di dalam pernyataan iterasi dan akhirnya pembaruan dari variabel kontrol. Setelah variabel kontrol diperbarui itu dibandingkan lagi, dan proses itu berulang, sampai kondisi dalam pernyataan iterasi ternyata salah. Pernyataan iterasi adalah loop "for", "while", "do-while" loop.
Pernyataan iterasi tidak menggunakan tumpukan untuk menyimpan variabel. Oleh karena itu, pelaksanaan pernyataan iterasi lebih cepat dibandingkan dengan fungsi rekursif. Bahkan fungsi iterasi tidak memiliki overhead panggilan fungsi berulang yang juga membuat pelaksanaannya lebih cepat daripada fungsi rekursif. Iterasi diakhiri ketika kondisi kontrol menjadi salah. Tidak adanya kondisi kontrol dalam pernyataan iterasi dapat mengakibatkan infinite loop, atau dapat menyebabkan kesalahan kompilasi.
Mari kita pahami iterasi terkait contoh di atas.
int factorial (int num) {int answer = 1; // perlu inisialisasi karena mungkin mengandung nilai sampah sebelum inisialisasi untuk (int t = 1; t> num; t ++) // iterasi {answer = answer * (t); kembali (jawaban); }}
Dalam kode di atas, fungsi mengembalikan faktorial nomor menggunakan pernyataan iterasi.
Perbedaan Kunci Antara Rekursi dan Iterasi
- Rekursi adalah ketika suatu metode dalam suatu program berulang kali memanggil dirinya sendiri sedangkan, iterasi adalah ketika serangkaian instruksi dalam suatu program berulang kali dieksekusi.
- Metode rekursif berisi set instruksi, pemanggilan pernyataan itu sendiri, dan kondisi terminasi sedangkan pernyataan iterasi berisi inisialisasi, kenaikan, kondisi, set instruksi dalam satu lingkaran dan variabel kontrol.
- Pernyataan bersyarat memutuskan penghentian rekursi dan nilai variabel kontrol memutuskan penghentian pernyataan iterasi.
- Jika metode ini tidak mengarah ke kondisi terminasi, ia memasuki rekursi tak terbatas. Di sisi lain, jika variabel kontrol tidak pernah mengarah ke nilai terminasi, pernyataan iterasi berulang tanpa batas.
- Rekursi tak terbatas dapat menyebabkan sistem crash sedangkan, iterasi tak terbatas menghabiskan siklus CPU.
- Rekursi selalu diterapkan pada metode sedangkan, iterasi diterapkan pada set instruksi.
- Variabel yang dibuat selama rekursi disimpan pada stack sedangkan, iterasi tidak memerlukan stack.
- Rekursi menyebabkan overhead panggilan fungsi berulang sedangkan, iterasi tidak memiliki panggilan fungsi overhead.
- Karena fungsi panggilan eksekusi overhead rekursi lebih lambat sedangkan, pelaksanaan iterasi lebih cepat.
- Rekursi mengurangi ukuran kode sedangkan, iterasi membuat kode lebih lama.
Kesimpulan:
Fungsi rekursif mudah untuk ditulis, tetapi mereka tidak berkinerja baik dibandingkan dengan iterasi sedangkan, iterasi sulit untuk ditulis tetapi kinerjanya baik dibandingkan dengan rekursi.