Bagaimana untuk melaksanakan strategi pengoptimuman rekursi ekor bagi fungsi rekursif C++?

WBOY
Lepaskan: 2024-04-17 14:42:01
asal
599 orang telah melayarinya

Strategi pengoptimuman rekursif ekor secara berkesan mengurangkan kedalaman tindanan panggilan fungsi dan menghalang limpahan tindanan dengan menukar panggilan rekursif ekor kepada gelung. Strategi pengoptimuman termasuk: Kesan rekursif ekor: Semak sama ada terdapat panggilan rekursif ekor dalam fungsi. Tukar fungsi kepada gelung: Gunakan gelung dan bukannya panggilan rekursif ekor dan kekalkan tindanan untuk menyimpan keadaan perantaraan.

C++ 递归函数的尾递归优化策略如何实现?

C++ Strategi Pengoptimuman Rekursif Ekor dalam Fungsi Rekursif

Pengenalan

Rekursi ekor bermaksud fungsi memanggil dirinya secara rekursif secara terakhir, semasa pelaksanaan panggilan ini adalah langkah terakhir. Mengoptimumkan rekursi ekor boleh mengurangkan kedalaman tindanan panggilan fungsi dengan ketara, dengan itu mengelakkan ranap program yang disebabkan oleh limpahan tindanan.

Strategi Pengoptimuman

Pengkompil C++ tidak mempunyai pengoptimuman rekursi ekor terbina dalam, tetapi kami boleh melaksanakan pengoptimuman secara manual dengan menukar fungsi rekursif ekor menjadi gelung:

  • Periksa semula ekor rekursi termasuk dalam fungsi Panggilan rekursif, iaitu:
int factorial(int n) {
  if (n == 0) {
    return 1;
  } else {
    return n * factorial(n - 1);
  }
}
Salin selepas log masuk
  • Tukar fungsi menjadi gelung: Gunakan seketika atau untuk gelung untuk menggantikan panggilan rekursif ekor, dan kekalkan tindanan untuk menyimpan keadaan perantaraan:
int factorial_optimized(int n) {
  int result = 1;
  while (n > 0) {
    result *= n;
    n--;
  }
  return result;
}
Salin selepas log masuk

Kes praktikal

Berikut ialah Contoh pengoptimuman rekursif ekor untuk mengira faktorial:

// 未优化的尾递归函数
int factorial(int n) {
  if (n == 0) {
    return 1;
  } else {
    return n * factorial(n - 1);
  }
}

// 优化的尾递归函数
int factorial_optimized(int n) {
  int result = 1;
  while (n > 0) {
    result *= n;
    n--;
  }
  return result;
}

int main() {
  int n = 5;
  int result = factorial(n);
  cout << "Factorial of " << n << " (unoptimized): " << result << endl;

  result = factorial_optimized(n);
  cout << "Factorial of " << n << " (optimized): " << result << endl;
  return 0;
}
Salin selepas log masuk

Output:

Factorial of 5 (unoptimized): 120
Factorial of 5 (optimized): 120
Salin selepas log masuk

Ia dapat dilihat bahawa fungsi yang dioptimumkan tidak memerlukan pengiraan semula yang sama kedalaman timbunan dan meningkatkan kecekapan.

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan strategi pengoptimuman rekursi ekor bagi fungsi rekursif C++?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan