Panggilan rekursif dalam fungsi Java menggunakan memori kerana setiap panggilan rekursif mencipta bingkai tindanan baharu pada tindanan. Untuk mengelakkan ralat limpahan tindanan, anda boleh mengehadkan kedalaman rekursi, melakukan pengoptimuman rekursi ekor atau menggunakan gelung dan bukannya rekursi.
Penggunaan memori panggilan rekursif dalam fungsi Java
Panggilan rekursif ialah satu cara untuk fungsi memanggil dirinya sendiri. Walau bagaimanapun, dalam Java, panggilan sedemikian boleh menggunakan sejumlah besar memori, menyebabkan ralat limpahan tindanan.
Apabila fungsi Java dipanggil secara rekursif, JVM mencipta bingkai tindanan baharu pada tindanan. Setiap bingkai tindanan mengandungi parameter fungsi, pembolehubah setempat dan alamat pemulangan. Apabila bilangan panggilan rekursif meningkat, bilangan bingkai tindanan pada tindanan juga meningkat.
Saiz setiap bingkai tindanan mungkin berbeza bergantung pada kerumitan fungsi dan bilangan parameter. Walau bagaimanapun, untuk panggilan fungsi biasa, bingkai tindanan boleh menduduki beratus-ratus bait memori.
Coretan kod berikut menunjukkan cara panggilan rekursif boleh menggunakan banyak memori:
public class Recursive { public static void main(String[] args) { int n = 100000; int result = factorial(n); System.out.println(result); } public static int factorial(int n) { if (n == 0) { return 1; } else { return n * factorial(n - 1); } } }
Dalam contoh ini, fungsi factorial
memanggil dirinya secara rekursif untuk mengira pemfaktoran nombor tertentu. Dengan lorsque n = 100000, kira-kira 99999 bingkai tindanan diperlukan untuk mengira hasilnya. Setiap bingkai tindanan mengambil masa kira-kira 500 bait, jadi jumlah penggunaan memori adalah lebih kurang 50 MB.
Untuk mengelakkan ralat limpahan tindanan, anda boleh menggunakan strategi berikut:
Anda boleh mengelakkan ralat limpahan tindanan dan mengurus penggunaan memori fungsi Java dengan menggunakan panggilan rekursif dengan berhati-hati dan menggunakan strategi yang sesuai.
Atas ialah kandungan terperinci Apakah penggunaan memori bagi panggilan rekursif dalam fungsi Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!