Panggilan rekursif ekor tidak akan mencipta bingkai tindanan fungsi baharu dan panggilan rekursif boleh dioptimumkan untuk mengelakkan keletihan ruang tindanan. Dalam kes sebenar, fungsi pengiraan faktorial telah dioptimumkan dengan memperkenalkan fungsi tambahan untuk menukar panggilan rekursif asal kepada panggilan rekursif ekor.
Panggilan rekursif dan ekor rekursif dalam fungsi Java
Panggilan rekursif
Panggilan rekursif ekor
Kes praktikal
Fungsi yang mengira faktorial boleh digunakan sebagai contoh panggilan rekursif:
public static int factorial(int n) { if (n == 0) { return 1; } return n * factorial(n - 1); // 递归调用 }
Untuk menukarnya menjadi panggilan rekursif ekor, fungsi tambahan boleh diperkenalkan:
public static int factorialTail(int n, int result) { if (n == 0) { return result; } return factorialTail(n - 1, n * result); // 尾递归调用 }
pembolehubah Nilai faktorial semasa disimpan, dan fungsi dipanggil secara rekursif pada penghujungnya sendiri untuk mengelak daripada mencipta bingkai tindanan fungsi baharu. result
Kesimpulan
Panggilan rekursif ekor boleh mengoptimumkan panggilan rekursif dengan mengelakkan penciptaan bingkai tindanan fungsi baharu. Walaupun mesin maya Java biasanya mengoptimumkan panggilan rekursif ekor secara automatik, menukar panggilan rekursif secara manual kepada panggilan rekursif ekor memastikan prestasi optimum.Atas ialah kandungan terperinci Apakah perbezaan antara panggilan rekursif dan ekor-rekursif dalam fungsi Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!