Rumah Java javaTutorial Apakah alternatif kepada panggilan rekursif dalam fungsi Java?

Apakah alternatif kepada panggilan rekursif dalam fungsi Java?

May 05, 2024 am 10:42 AM
rekursi kitaran limpahan timbunan

Apakah alternatif kepada panggilan rekursif dalam fungsi Java?

Ganti panggilan rekursif dalam fungsi Java dengan lelaran

Di Java, rekursi ialah alat berkuasa yang digunakan untuk menyelesaikan pelbagai masalah. Walau bagaimanapun, dalam beberapa kes, menggunakan lelaran mungkin merupakan pilihan yang lebih baik kerana ia lebih cekap dan kurang terdedah kepada limpahan tindanan.

Berikut adalah kelebihan lelaran:

  • Lebih cekap kerana ia tidak memerlukan penciptaan bingkai tindanan baharu untuk setiap panggilan rekursif.
  • Limpahan timbunan tidak mudah berlaku kerana penggunaan ruang timbunan adalah terhad.

Kaedah berulang dan bukannya panggilan rekursif:

Terdapat beberapa cara dalam Java untuk menukar fungsi rekursif kepada fungsi berulang.

1. Gunakan tindanan

Menggunakan tindanan ialah cara paling mudah untuk menukar fungsi rekursif kepada fungsi berulang. Tindanan ialah struktur data masuk-dahulu-keluar (LIFO), serupa dengan timbunan panggilan fungsi.

public int factorial(int n) {
    Stack<Integer> stack = new Stack<>();
    stack.push(n);
    while (!stack.isEmpty()) {
        int curr = stack.pop();
        if (curr == 1) {
            return 1;
        }
        stack.push(curr - 1);
        stack.push(curr);
    }
}
Salin selepas log masuk

2. Menggunakan baris gilir

Anda juga boleh menggunakan baris gilir untuk menukar fungsi rekursif kepada fungsi berulang. Baris gilir ialah struktur data masuk dahulu, keluar dahulu (FIFO), serupa dengan baris gilir mesej.

public int factorial(int n) {
    Queue<Integer> queue = new LinkedList<>();
    queue.offer(n);
    while (!queue.isEmpty()) {
        int curr = queue.poll();
        if (curr == 1) {
            return 1;
        }
        queue.offer(curr - 1);
        queue.offer(curr);
    }
}
Salin selepas log masuk

3 Simulasikan tindanan panggilan fungsi secara manual

Anda juga boleh mensimulasikan tindanan panggilan fungsi secara manual untuk melaksanakan lelaran. Ini melibatkan secara eksplisit mengekalkan tatasusunan bingkai tindanan dan menjejaki bingkai tindanan semasa melalui indeks tatasusunan.

public int factorial(int n) {
    int[] stack = new int[100];
    int top = -1;
    stack[++top] = 1;
    stack[++top] = n;
    while (top > 0) {
        int curr = stack[top--];
        if (curr == 1) {
            return stack[top--];
        }
        stack[++top] = curr - 1;
        stack[++top] = curr;
    }
}
Salin selepas log masuk

Kes Praktikal: Jujukan Fibonacci

Mari kita ambil Jujukan Fibonacci sebagai contoh untuk menggambarkan cara menggunakan lelaran dan bukannya rekursi.

// 递归
public int fib(int n) {
    if (n <= 1) {
        return n;
    }
    return fib(n - 1) + fib(n - 2);
}

// 迭代(使用队列)
public int fib(int n) {
    Queue<Integer> queue = new LinkedList<>();
    queue.offer(0);
    queue.offer(1);
    while (n-- > 1) {
        int a = queue.poll();
        int b = queue.poll();
        queue.offer(a + b);
    }
    return queue.poll();
}
Salin selepas log masuk

Dengan menggunakan lelaran, kami mengelakkan overhed panggilan rekursif dan meningkatkan kecekapan.

Atas ialah kandungan terperinci Apakah alternatif kepada panggilan rekursif dalam fungsi Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Pelaksanaan rekursif fungsi C++: Adakah terdapat had untuk kedalaman rekursif? Pelaksanaan rekursif fungsi C++: Adakah terdapat had untuk kedalaman rekursif? Apr 23, 2024 am 09:30 AM

Kedalaman rekursi fungsi C++ adalah terhad, dan melebihi had ini akan mengakibatkan ralat limpahan tindanan. Nilai had berbeza antara sistem dan penyusun, tetapi biasanya antara 1,000 dan 10,000. Penyelesaian termasuk: 1. Pengoptimuman rekursi ekor; 2. Panggilan ekor;

Adakah ungkapan lambda C++ menyokong rekursi? Adakah ungkapan lambda C++ menyokong rekursi? Apr 17, 2024 pm 09:06 PM

Ya, ungkapan Lambda C++ boleh menyokong rekursi dengan menggunakan std::function: Gunakan std::function untuk menangkap rujukan kepada ungkapan Lambda. Dengan rujukan yang ditangkap, ungkapan Lambda boleh memanggil dirinya secara rekursif.

Mengapa c++ ranap apabila ia mula dilaksanakan? Mengapa c++ ranap apabila ia mula dilaksanakan? Apr 22, 2024 pm 05:57 PM

Sebab program C++ ranap apabila bermula termasuk: kehilangan perpustakaan atau kebergantungan yang diperlukan, penunjuk yang tidak dimulakan atau limpahan timbunan rujukan, segfault, isu konfigurasi sistem pengendalian, ralat program, isu perkakasan

Pelaksanaan rekursif fungsi C++: Analisis perbandingan algoritma rekursif dan bukan rekursif? Pelaksanaan rekursif fungsi C++: Analisis perbandingan algoritma rekursif dan bukan rekursif? Apr 22, 2024 pm 03:18 PM

Algoritma rekursif menyelesaikan masalah berstruktur melalui fungsi panggilan kendiri Kelebihannya ialah ia mudah dan mudah difahami, tetapi kelemahannya ialah ia kurang cekap dan boleh menyebabkan limpahan timbunan Algoritma bukan rekursif mengelakkan pengulangan dengan menguruskan secara eksplisit struktur data timbunan Kelebihannya ialah ia lebih cekap dan mengelakkan limpahan, kelemahannya ialah kod itu mungkin lebih kompleks. Pilihan rekursif atau bukan rekursif bergantung kepada masalah dan kekangan khusus pelaksanaan.

Penjelasan terperinci tentang rekursi fungsi C++: aplikasi rekursi dalam pemprosesan rentetan Penjelasan terperinci tentang rekursi fungsi C++: aplikasi rekursi dalam pemprosesan rentetan Apr 30, 2024 am 10:30 AM

Fungsi rekursif ialah teknik yang memanggil dirinya berulang kali untuk menyelesaikan masalah dalam pemprosesan rentetan. Ia memerlukan syarat penamatan untuk mengelakkan rekursi tak terhingga. Rekursi digunakan secara meluas dalam operasi seperti pembalikan rentetan dan pemeriksaan palindrom.

Apakah perbezaan antara fungsi Java dan fungsi Haskell? Apakah perbezaan antara fungsi Java dan fungsi Haskell? Apr 23, 2024 pm 09:18 PM

Perbezaan utama antara fungsi Java dan Haskell ialah: Sintaks: Java menggunakan kata kunci pulangan untuk mengembalikan hasil, manakala Haskell menggunakan simbol tugasan (=). Model pelaksanaan: Java menggunakan pelaksanaan berurutan, manakala Haskell menggunakan penilaian malas. Sistem jenis: Java mempunyai sistem jenis statik, manakala Haskell mempunyai sistem jenis fleksibel yang berkuasa yang menyemak jenis pada masa penyusunan dan masa jalankan. Prestasi praktikal: Haskell lebih cekap daripada Java apabila mengendalikan input besar kerana ia menggunakan rekursi ekor, manakala Java menggunakan rekursi.

Panduan pemula untuk rekursi C++: Membina asas dan membangunkan intuisi Panduan pemula untuk rekursi C++: Membina asas dan membangunkan intuisi May 01, 2024 pm 05:36 PM

Rekursif ialah teknik berkuasa yang membolehkan fungsi memanggil dirinya sendiri untuk menyelesaikan masalah Dalam C++, fungsi rekursif terdiri daripada dua elemen utama: kes asas (menentukan apabila rekursif berhenti) dan panggilan rekursif (memecahkan masalah kepada sub yang lebih kecil. -masalah). Dengan memahami asas dan mempraktikkan contoh praktikal seperti pengiraan faktorial, jujukan Fibonacci dan traversal pokok binari, anda boleh membina gerak hati rekursif anda dan menggunakannya dalam kod anda dengan yakin.

Rekursi fungsi C++ dijelaskan: alternatif kepada rekursi Rekursi fungsi C++ dijelaskan: alternatif kepada rekursi May 01, 2024 pm 04:54 PM

Rekursi ialah teknik di mana fungsi memanggil dirinya sendiri, tetapi mempunyai kelemahan limpahan tindanan dan ketidakcekapan. Alternatif termasuk: pengoptimuman rekursif ekor, di mana pengkompil mengoptimumkan panggilan rekursif ke dalam gelung, yang menggunakan gelung dan bukannya rekursi, yang membolehkan pelaksanaan dijeda dan disambung semula, mensimulasikan tingkah laku rekursif.

See all articles