Rekursi dan gelung ialah kedua-dua alat asas untuk melaksanakan tugas berulang dalam pengaturcaraan. Walaupun gelung suka untuk dan sementara adalah intuitif untuk kebanyakan pembangun, rekursi menawarkan pendekatan yang lebih abstrak dan fleksibel untuk menyelesaikan masalah. Artikel ini meneroka cara menukar gelung kepada fungsi rekursif, menyediakan templat umum dan menerangkan konsep dan pengoptimuman pengulangan ekor.
Rekursi ialah teknik di mana fungsi memanggil dirinya sendiri untuk menyelesaikan kejadian yang lebih kecil daripada masalah yang sama. Tingkah laku rujukan kendiri ini berterusan sehingga syarat asas yang ditentukan dipenuhi.
Contohnya, mengira pemfaktoran nombor menggunakan rekursi:
function factorial(n) { if (n <= 1) return 1; // Base case return n * factorial(n - 1); // Recursive case }
Dalam contoh ini, faktorial(n - 1) mengurangkan saiz masalah dengan setiap panggilan, akhirnya ditamatkan apabila n ialah 1.
Untuk menukar gelung kepada rekursi, ikut langkah berikut:
function recursiveFunction(iterationState, dataOrAccumulator) { // Base case: Define when recursion stops if (baseCondition(iterationState)) { return dataOrAccumulator; // Final result } // Perform the action for the current iteration const updatedData = updateAccumulator(dataOrAccumulator, iterationState); // Recursive call with updated state return recursiveFunction(updateIterationState(iterationState), updatedData); }
Menggunakan Gelung:
function sumArray(arr) { let sum = 0; for (let i = 0; i < arr.length; i++) { sum += arr[i]; } return sum; }
Menggunakan Rekursi:
function sumArrayRecursive(arr, index = 0) { if (index >= arr.length) return 0; // Base case return arr[index] + sumArrayRecursive(arr, index + 1); // Recursive case }
Menggunakan Gelung:
function countdown(n) { while (n > 0) { console.log(n); n--; } }
Menggunakan Rekursi:
function countdownRecursive(n) { if (n <= 0) return; // Base case console.log(n); // Current iteration work countdownRecursive(n - 1); // Recursive case }
Ekor rekursi ialah bentuk khas rekursi di mana panggilan rekursif adalah operasi terakhir dalam fungsi. Ini bermakna tiada pengiraan tambahan berlaku selepas panggilan rekursif kembali.
Contoh Rekursi Ekor:
function factorialTailRecursive(n, accumulator = 1) { if (n <= 1) return accumulator; // Base case return factorialTailRecursive(n - 1, accumulator * n); // Tail-recursive call }
Contoh Rekursi Bukan Ekor:
function factorial(n) { if (n <= 1) return 1; // Base case return n * factorial(n - 1); // Recursive case }
Untuk menulis fungsi rekursif ekor, ikut corak ini:
function recursiveFunction(iterationState, dataOrAccumulator) { // Base case: Define when recursion stops if (baseCondition(iterationState)) { return dataOrAccumulator; // Final result } // Perform the action for the current iteration const updatedData = updateAccumulator(dataOrAccumulator, iterationState); // Recursive call with updated state return recursiveFunction(updateIterationState(iterationState), updatedData); }
function sumArray(arr) { let sum = 0; for (let i = 0; i < arr.length; i++) { sum += arr[i]; } return sum; }
function sumArrayRecursive(arr, index = 0) { if (index >= arr.length) return 0; // Base case return arr[index] + sumArrayRecursive(arr, index + 1); // Recursive case }
Menukar gelung kepada rekursi ialah teknik berkuasa yang membolehkan kod yang lebih abstrak dan fleksibel. Dengan memahami dan menggunakan templat rekursif, pembangun boleh menggantikan binaan berulang dengan penyelesaian rekursif. Memanfaatkan rekursi ekor seterusnya meningkatkan prestasi dan mengurangkan risiko limpahan tindanan, dengan syarat persekitaran menyokong pengoptimuman panggilan ekor.
Menguasai konsep ini membuka pintu untuk menyelesaikan pelbagai masalah yang lebih luas dengan cekap dan elegan.
Atas ialah kandungan terperinci Menukar Gelung kepada Rekursi: Templat dan Rekursi Ekor Diterangkan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!