Disyorkan, 2024

Pilihan Editor

Perbezaan Antara Rekursi dan Pengulangan

Rekursi dan lelaran kedua-dua berulang kali melaksanakan himpunan arahan. Rekursi adalah apabila pernyataan dalam fungsi memanggil sendiri berulang kali. Lelaran adalah apabila gelung berulang kali dilaksanakan sehingga keadaan pengawalan menjadi palsu. Perbezaan utama antara rekursi dan lelaran ialah rekursi adalah proses, selalu digunakan untuk fungsi. Penyerahan diterapkan pada set arahan yang kita mahu mendapat berkali-kali dilaksanakan.

Carta Perbandingan

Asas Untuk PerbandinganRekursiPengulangan
AsasKenyataan dalam satu fungsi berfungsi memanggil fungsi itu sendiri.Membolehkan set arahan untuk berulang kali dilaksanakan.
FormatDalam fungsi rekursif, hanya keadaan penamatan (kes asas) ditentukan.Pengelasan termasuk permulaan, keadaan, pelaksanaan pernyataan dalam gelung dan kemas kini (kenaikan dan pengurangan) pemboleh ubah kawalan.
PenamatanKenyataan bersyarat dimasukkan dalam badan fungsi untuk memaksa fungsi untuk kembali tanpa panggilan rekursi yang dilaksanakan.Pernyataan lelaran berulang kali dilaksanakan sehingga keadaan tertentu tercapai.
KeadaanSekiranya fungsi itu tidak menumpuk kepada keadaan yang dipanggil (kes asas), ia membawa kepada rekursi tak terhingga.Jika keadaan kawalan dalam pernyataan lelaran tidak pernah menjadi palsu, ia membawa kepada lelaran tak terhingga.
Pengulangan InfiniteRekursi Infinite boleh merosakkan sistem.Gelung infinit menggunakan kitaran CPU berulang kali.
DimohonRekursi sentiasa digunakan untuk fungsi.Pengalihan digunakan untuk penyataan pengulangan atau "gelung".
TimbunanTumpukan digunakan untuk menyimpan set pemboleh ubah tempatan dan parameter setiap kali fungsi dipanggil.Tidak menggunakan timbunan.
OverheadRekursa mempunyai overhed panggilan fungsi berulang.Tiada overhead panggilan berfungsi berulang.
KelajuanPerlahan dalam pelaksanaan.Cepat dalam pelaksanaan.
Saiz KodRekursi mengurangkan saiz kod.Pengulangan menjadikan kod itu lebih lama.

Definisi Rekursi

C ++ membolehkan fungsi menamakan dirinya dalam kodnya. Ini bermakna takrif fungsi mempunyai fungsi panggilan kepada dirinya sendiri. Kadang-kadang ia juga dipanggil " definisi bulat ". Set pembolehubah tempatan dan parameter yang digunakan oleh fungsi baru dicipta setiap kali fungsi panggilan itu sendiri dan disimpan di bahagian atas timbunan. Tetapi, setiap kali panggilan berfungsi sendiri, ia tidak membuat salinan baru fungsi itu. Fungsi rekursif tidak dapat mengurangkan saiz kod dan tidak meningkatkan penggunaan memori, tetapi ia berlaku apabila dibandingkan dengan lelaran.

Untuk menamatkan rekursi, anda mesti memasukkan pernyataan pilih dalam takrif fungsi untuk memaksa fungsi itu kembali tanpa memberikan panggilan rekursif kepada dirinya sendiri. Ketiadaan pernyataan pilih dalam definisi fungsi rekursif akan membiarkan fungsi dalam rekursi tak terhingga sekali dipanggil.

Marilah kita memahami rekursi dengan fungsi yang akan mengembalikan faktorial nombor tersebut.

 int factorial (int num) {int answer; jika (num == 1) {kembali 1; } else {answer = factorial (num-1) * num; // panggilan balik rekursif} kembali (jawapan); } 

Dalam kod di atas, pernyataan di bahagian lain menunjukkan rekursi, kerana pernyataan itu memanggil faktorial fungsi () di mana ia berada.

Definisi Pengulangan

Pengulangan ialah proses melaksanakan himpunan arahan berulang kali sehingga keadaan dalam pernyataan lelaran menjadi palsu. Pernyataan lelaran termasuk permulaan, perbandingan, pelaksanaan pernyataan dalam pernyataan lelaran dan akhirnya pengemaskinian pemboleh ubah kawalan. Selepas pemboleh ubah kawalan dikemas kini ia dibandingkan sekali lagi, dan proses itu berulang, sehingga keadaan dalam pernyataan lelaran ternyata salah. Kenyataan lelaran adalah "untuk" gelung, "sementara" gelung, "buat sementara" gelung.

Pernyataan lelaran tidak menggunakan timbunan untuk menyimpan pembolehubah. Oleh itu, pelaksanaan pernyataan lelaran lebih cepat berbanding dengan fungsi rekursif. Malah fungsi lelaran tidak mempunyai overhead fungsi panggilan berulang yang juga membuat pelaksanaannya lebih cepat daripada fungsi rekursif. Perulangan ditamatkan apabila keadaan kawalan menjadi salah. Ketiadaan keadaan kawalan dalam pernyataan lelaran boleh menyebabkan gelung tak terhingga, atau ia boleh menyebabkan kesilapan kompilasi.

Mari kita fahami lelaran mengenai contoh di atas.

 int factorial (int num) {int answer = 1; // inisikan keperluan kerana mungkin mengandungi nilai sampah sebelum inisialisasinya (int t = 1; t> num; t ++) // iteration {answer = answer * (t); kembali (jawapan); }} 

Dalam kod di atas, fungsi mengembalikan faktorial nombor menggunakan pernyataan lelaran.

Perbezaan Utama Antara Rekursi dan Pengulangan

  1. Rekursi adalah apabila satu kaedah dalam suatu program berulang kali memanggil sendiri sedangkan, lelaran adalah apabila satu set arahan dalam suatu program berulang kali dilaksanakan.
  2. Kaedah rekursif mengandungi set arahan, pernyataan panggilan sendiri, dan keadaan penamatan manakala pernyataan lelaran mengandungi inisialisasi, kenaikan, keadaan, set arahan dalam gelung dan pemboleh ubah kawalan.
  3. Pernyataan bersyarat memutuskan penamatan nilai pembalikan rekursor dan kawalan memutuskan penamatan penyataan lelaran.
  4. Sekiranya kaedah tidak membawa kepada keadaan penamatan ia memasuki rekursi tak terhingga. Sebaliknya, jika pemboleh ubah kawalan tidak pernah membawa kepada nilai penamatan, pernyataan lelaran melayang tanpa batas.
  5. Rekursi tak terhingga boleh menyebabkan kemalangan sistem sedangkan, lelaran tak terhingga menggunakan kitaran CPU.
  6. Rekursi sentiasa digunakan pada kaedah manakala, lelaran digunakan untuk menetapkan arahan.
  7. Pembolehubah yang dibuat semasa rekursi disimpan pada timbunan manakala, lelaran tidak memerlukan timbunan.
  8. Rekursi menyebabkan overhead fungsi yang berulang memanggil sedangkan, lelaran tidak mempunyai fungsi memanggil overhead.
  9. Oleh kerana fungsi memanggil pelaksanaan overhead rekursi adalah lebih lambat sedangkan, pelaksanaan lelaran lebih cepat.
  10. Rekursi mengurangkan saiz kod sedangkan, lelaran membuat kod lebih lama.

Kesimpulan:

Fungsi rekursif mudah ditulis, tetapi mereka tidak berfungsi dengan baik berbanding dengan lelaran sedangkan, lelaran sukar untuk ditulis tetapi prestasi mereka adalah baik dibandingkan dengan rekursi.

Top