Rumah >Java >javaTutorial >Bagaimana untuk mengelakkan limpahan timbunan daripada panggilan rekursif dalam fungsi Java?

Bagaimana untuk mengelakkan limpahan timbunan daripada panggilan rekursif dalam fungsi Java?

WBOY
WBOYasal
2024-04-30 11:42:011051semak imbas

Bagaimana untuk mengelakkan limpahan tindanan yang disebabkan oleh panggilan rekursif dalam fungsi Java? Gunakan gelung dan bukannya rekursi. Elakkan rekursi yang mendalam. Gunakan rekursi ekor. Tetapkan had saiz tindanan.

Bagaimana untuk mengelakkan limpahan timbunan daripada panggilan rekursif dalam fungsi Java?

Elakkan limpahan tindanan daripada panggilan rekursif dalam fungsi Java

Fungsi rekursif sangat berguna dalam Java, tetapi jika digunakan secara tidak betul, ia boleh menyebabkan ralat limpahan tindanan. Limpahan tindanan berlaku apabila bilangan panggilan fungsi menjadi terlalu besar, meletihkan memori yang tersedia.

Cara limpahan tindanan berlaku

Apabila fungsi berulang, ia mencipta bingkai tindanan baharu. Setiap bingkai tindanan mengandungi pembolehubah tempatan fungsi dan alamat pemulangan. Jika fungsi berulang terlalu banyak kali, bilangan bingkai tindanan melebihi memori yang tersedia, menyebabkan limpahan tindanan. Petua untuk mengelakkan limpahan tindanan Gelung tidak mencipta bingkai tindanan baharu dan oleh itu tidak boleh menyebabkan limpahan tindanan.

Elakkan rekursif dalam: Hadkan kedalaman timbunan panggilan rekursif. Jika boleh, pecahkan fungsi rekursif kepada bahagian yang lebih kecil dan lebih mudah diurus.

Gunakan rekursi ekor:
    Rekursi ekor bermaksud langkah terakhir fungsi rekursif ialah memanggil dirinya sendiri. Pengkompil Java boleh mengoptimumkan rekursi ekor untuk mengelak daripada mencipta bingkai tindanan baharu.
  • Tetapkan had saiz tindanan:
  • Anda boleh mengehadkan saiz tindanan Mesin Maya Java (JVM) dengan menetapkan pilihan -Xss. Ini menghalang memori tersedia yang meletihkan sebelum timbunan melimpah.
  • Contoh Praktikal
  • Pertimbangkan fungsi rekursif berikut yang mengira nombor Fibonacci:
  • public static int fib(int n) {
        if (n <= 1) {
            return n;
        } else {
            return fib(n - 1) + fib(n - 2);
        }
    }
  • Fungsi ini berulang terlalu dalam dan untuk nilai n yang besar, ia menyebabkan limpahan tindanan. Untuk mengelakkan ini, kita boleh menggunakan gelung dan bukannya rekursi:
    public static int fib(int n) {
        int a = 0;
        int b = 1;
        for (int i = 0; i < n; i++) {
            int temp = a;
            a = b;
            b = temp + b;
        }
        return a;
    }
    Versi gelung ini tidak mencipta bingkai tindanan baharu, jadi ia tidak akan menyebabkan limpahan tindanan.

Atas ialah kandungan terperinci Bagaimana untuk mengelakkan limpahan timbunan daripada panggilan rekursif dalam fungsi Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn