Takrifan dan pengoptimuman rekursi: Rekursi: Fungsi memanggil dirinya sendiri secara dalaman untuk menyelesaikan masalah sukar yang boleh diuraikan kepada sub-masalah yang lebih kecil. Rekursi ekor: Fungsi melakukan semua pengiraan sebelum membuat panggilan rekursif, yang boleh dioptimumkan menjadi gelung. Keadaan pengoptimuman rekursif ekor: panggilan rekursif ialah operasi terakhir. Parameter panggilan rekursif adalah sama dengan parameter panggilan asal. Contoh praktikal: Kira faktorial: Fungsi tambahan factorial_helper melaksanakan pengoptimuman rekursi ekor, menghapuskan timbunan panggilan dan meningkatkan kecekapan. Kira nombor Fibonacci: Fungsi rekursif ekor fibonacci_helper menggunakan pengoptimuman untuk mengira nombor Fibonacci dengan cekap.
Apakah rekursi?
Rekursi merujuk kepada proses memanggil dirinya di dalam fungsi. Rekursi ialah alat penyelesaian masalah yang berkuasa apabila masalah itu boleh dipecahkan kepada satu siri sub-masalah yang lebih kecil yang boleh diselesaikan dengan cara yang sama.
Apakah rekursi ekor?
Ekor rekursi ialah bentuk khas rekursi di mana fungsi membuat panggilan rekursif selepas semua pengiraan lain telah dilakukan. Bentuk rekursif ini boleh dioptimumkan kerana pengkompil boleh menghapuskan timbunan panggilan fungsi rekursif, dengan itu meningkatkan prestasi.
Pengoptimuman Rekursif Ekor
Untuk mengoptimumkan panggilan rekursif ekor, pengkompil akan menukar panggilan rekursif kepada gelung. Ini menghapuskan keperluan untuk mencipta timbunan panggilan, dengan itu meningkatkan kecekapan. Untuk fungsi rekursif dioptimumkan ekor-rekursif, syarat berikut mesti dipenuhi:
Contoh
Pertimbangkan fungsi rekursif berikut yang mengira faktorial:
int factorial(int n) { if (n == 0) { return 1; } else { return n * factorial(n - 1); } }
Fungsi ini bukan rekursif ekor kerana panggilan rekursif berlaku sebelum penyataan pemulangan. Untuk menukar fungsi ini kepada rekursif ekor, kita boleh menggunakan fungsi pembantu:
int factorial_helper(int n, int result) { if (n == 0) { return result; } else { return factorial_helper(n - 1, n * result); } } int factorial(int n) { return factorial_helper(n, 1); }
Kini, fungsifactorial_helper
adalah rekursif ekor kerana ia membuat panggilan rekursif selepas semua pengiraan lain telah dilakukan. Pengkompil boleh mengoptimumkan fungsi ini ke dalam gelung, dengan itu menghapuskan timbunan panggilan dan meningkatkan prestasi.
Kes praktikal
Berikut ialah fungsi rekursif ekor yang mengira nombor Fibonacci:
int fibonacci(int n) { return fibonacci_helper(n, 0, 1); } int fibonacci_helper(int n, int a, int b) { if (n == 0) { return a; } else if (n == 1) { return b; } else { return fibonacci_helper(n - 1, b, a + b); } }
Fungsi ini menggunakan pengoptimuman rekursi ekor untuk mengira nombor Fibonacci dengan cekap.
Atas ialah kandungan terperinci Penjelasan terperinci tentang rekursi fungsi C++: pengoptimuman rekursi ekor. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!