Bolehkah Fungsi Rekursif Dioptimumkan untuk Sebaris?
Dalam pengaturcaraan, fungsi sebaris ialah fungsi yang disertakan secara langsung dalam kod sumber yang memanggilnya. Proses ini meningkatkan kecekapan dengan menghapuskan overhed untuk memanggil fungsi luaran. Walau bagaimanapun, sesetengah pembangun mempersoalkan sama ada fungsi rekursif boleh dioptimumkan untuk sebaris.
Pertimbangkan coretan kod berikut:
<code class="c++">inline int factorial(int n) { if(!n) return 1; else return n*factorial(n-1); }</code>
Timbul kebimbangan bahawa pelaksanaan rekursif ini boleh membawa kepada "penyusunan tak terhingga" jika tidak dikendalikan dengan betul oleh pengkompil. Persoalannya menjadi: Bagaimanakah pengkompil membuat keputusan untuk menyelaraskan fungsi, terutamanya apabila ia rekursif?
Jawapannya terletak pada sifat spesifikasi sebaris. Ia hanyalah petunjuk kepada pengkompil. Penyusun mempunyai budi bicara untuk mengabaikan cadangan ini atau malah menyelaraskan fungsi bukan sebaris. Walau bagaimanapun, pengkompil boleh menyelaraskan fungsi rekursif.
Pengkompil boleh melaksanakan pengoptimuman ini dengan menetapkan had kedalaman rekursi yang akan dibuka. Sebagai contoh, pengkompil yang mengoptimumkan boleh mengubah kod yang disediakan kepada yang berikut:
<code class="c++">int factorial(int n) { if (n <= 1) { return 1; } else { return n * factorial(n - 1); } } int f(int x) { if (x <= 1) { return 1; } else { int x2 = x - 1; if (x2 <= 1) { return x * 1; } else { int x3 = x2 - 1; if (x3 <= 1) { return x * x2 * 1; } else { return x * x2 * x3 * factorial(x3 - 1); } } } }</code>
Dalam contoh ini, fungsi itu pada dasarnya diselaraskan tiga kali. Pengoptimuman ini disokong oleh beberapa penyusun, seperti MSVC , yang membenarkan penyesuaian tahap sebaris untuk fungsi rekursif.
Atas ialah kandungan terperinci Bilakah Fungsi Rekursif Boleh Disebaris?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!