Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Pelaksanaan rekursif fungsi C++: Bagaimana untuk mengoptimumkan rekursi menggunakan teknik memoisasi?

Pelaksanaan rekursif fungsi C++: Bagaimana untuk mengoptimumkan rekursi menggunakan teknik memoisasi?

WBOY
WBOYasal
2024-04-22 15:03:01828semak imbas

Teknologi memo rekursif yang dioptimumkan: Gunakan memo untuk menyimpan hasil yang dikira untuk mengelakkan pengiraan berulang. Gunakan unordered_map dalam C++ sebagai peringatan untuk menyemak sama ada keputusan wujud sebelum mengiranya. Simpan hasil pengiraan dan kembalikannya untuk meningkatkan prestasi tugasan intensif pengiraan seperti merentasi direktori.

C++ 函数的递归实现:如何使用备忘录技术优化递归?

Pelaksanaan rekursif fungsi C++: Pengoptimuman menggunakan teknik memo

Rekursi ialah teknik berkuasa yang membolehkan fungsi memanggil diri mereka sendiri. Walau bagaimanapun, apabila fungsi rekursif menyelesaikan masalah yang sama, ia mungkin menyebabkan banyak pengiraan berulang, sekali gus mengurangkan prestasi masa jalan. Teknik memoisasi ialah teknik biasa untuk mengoptimumkan algoritma rekursif dan boleh meningkatkan kecekapan dengan ketara.

Apakah teknologi memo?

Teknik memo melibatkan mencipta dan menyelenggara jadual yang dipanggil memo. Jadual ini menyimpan hasil panggilan fungsi yang telah dikira. Apabila panggilan fungsi yang sama berlaku lagi, kami mula-mula menyemak memo untuk melihat sama ada ia telah dinilai. Sekiranya ia telah dikira, kami terus mengembalikan hasil yang disimpan untuk mengelakkan pengiraan berganda.

Pelaksanaan

Melaksanakan pengoptimuman memo dalam C++ adalah sangat mudah. Berikut adalah contoh fungsi yang menggunakan memo untuk mengira nombor Fibonacci:

#include <unordered_map>

using namespace std;

// 创建备忘录
unordered_map<int, int> memo;

int fibonacci(int n) {
  // 检查备忘录中是否存在结果
  if (memo.find(n) != memo.end()) {
    return memo[n]; // 返回存储的结果
  }

  // 计算结果并存储在备忘录中
  int result;
  if (n <= 1) {
    result = 1;
  } else {
    result = fibonacci(n - 1) + fibonacci(n - 2);
  }
  memo[n] = result;
  return result;
}

Dalam kod di atas, hasil memo 无序映射用作备忘录。fibonacci 函数首先检查 memo 中是否存在指定数字 n. Jika ada, fungsi mengembalikan hasil yang disimpan secara langsung. Jika tidak, ia mengira hasilnya, menyimpannya dalam memo dan mengembalikannya.

Kes Praktikal

Mari kita pertimbangkan contoh dunia sebenar: mengira bilangan fail dalam direktori. Kita boleh menggunakan algoritma rekursif, yang merentasi direktori dan memproses semua subdirektori secara rekursif. Tanpa penggunaan memo, algoritma akan menghadapi pengiraan berganda yang teruk apabila melintasi struktur direktori yang besar.

Menggunakan memo kita boleh meningkatkan prestasi dengan ketara. Apabila direktori diakses, kita boleh menyimpan laluannya dalam memento dan junto con jumlah failnya. Apabila direktori yang sama diakses kemudian, kami boleh mendapatkan kiraan terus dari memo, mengelakkan pengiraan dua kali.

Kesimpulan

Teknik memo ialah cara yang berkesan untuk mengoptimumkan fungsi rekursif dalam C++. Dengan menyimpan hasil yang telah dikira, kami mengelakkan pengiraan berulang, sekali gus meningkatkan prestasi masa jalan. Pengoptimuman memo amat berfaedah apabila menyelesaikan algoritma yang mengandungi sejumlah besar submasalah berulang.

Atas ialah kandungan terperinci Pelaksanaan rekursif fungsi C++: Bagaimana untuk mengoptimumkan rekursi menggunakan teknik memoisasi?. 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