Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Elakkan gelung tak terhingga rekursif dalam pembangunan bahasa PHP

Elakkan gelung tak terhingga rekursif dalam pembangunan bahasa PHP

WBOY
WBOYasal
2023-06-10 19:00:06922semak imbas

Dalam pembangunan PHP, fungsi rekursif sering digunakan untuk menyelesaikan masalah tertentu. Fungsi rekursif membantu pengaturcara menyelesaikan masalah dengan memanggil diri mereka sendiri, memudahkan masalah. Walau bagaimanapun, jika fungsi rekursif ditulis secara tidak betul, ia boleh mengakibatkan gelung tidak terhingga, mengambil terlalu banyak memori dan mungkin menyebabkan pelayan ranap. Oleh itu, semasa menulis kod PHP, anda mesti mengikut beberapa peraturan untuk memastikan anda mengelakkan masalah gelung tak terhingga rekursif.

1. Keadaan akhir rekursif yang jelas

Mana-mana fungsi rekursif mesti mempunyai keadaan akhir yang jelas untuk memastikan fungsi itu boleh keluar dari rekursi dan mengembalikan nilai. Jika tiada keadaan akhir yang sesuai, fungsi itu mungkin berulang selama-lamanya, akhirnya membawa kepada gelung tak terhingga. Oleh itu, apabila menulis fungsi rekursif, mula-mula pertimbangkan keadaan penamat. Sebagai contoh, kita boleh mempertimbangkan untuk menggunakan pernyataan if dalam fungsi rekursif untuk menentukan sama ada parameter fungsi memenuhi syarat tertentu Apabila syarat tidak dipenuhi, rekursi tamat.

Berikut ialah contoh fungsi rekursif yang mencari faktorial, menggunakan keadaan akhir yang jelas:

function factorial($n) {
  if ($n == 0) {
    return 1;
  } else {
    return $n * factorial($n - 1);
  }
}

Dalam fungsi ini, apabila $n=0$, fungsi mengembalikan 1, menamatkan rekursi .

2. Elakkan kedalaman rekursi yang berlebihan

Timbunan panggilan fungsi rekursif akan mencipta bingkai baharu setiap kali ia berulang dan menyimpan parameter dan status berjalan dalam tindanan. Jika kedalaman rekursi terlalu besar, ia akan menduduki terlalu banyak memori dan boleh menyebabkan pelayan ranap. Oleh itu, semasa menulis fungsi rekursif, cuba elakkan kedalaman rekursif yang berlebihan, dan pertimbangkan juga cara mengoptimumkan kod.

Berikut ialah fungsi rekursif bagi jujukan Fibonacci Memandangkan setiap rekursi memanggil dirinya sendiri dua kali, kedalaman rekursi adalah sangat besar dan limpahan tindanan cenderung berlaku:

function fibonacci($n) {
  if ($n == 0 || $n == 1) {
    return $n;
  } else {
    return fibonacci($n - 1) + fibonacci($n - 2);
  }
}

boleh digunakan Satu lelaran. kaedah digunakan untuk menyelesaikan masalah ini, seperti yang ditunjukkan di bawah:

function fibonacci($n) {
  $a = 0;
  $b = 1;
  for ($i = 0; $i < $n; $i++) {
    $c = $a + $b;
    $a = $b;
    $b = $c;
  }
  return $a;
}

Fungsi ini menggunakan kaedah berulang untuk mengurangkan kedalaman rekursi kepada 1, mengelakkan masalah limpahan tindanan.

3 Elakkan menggunakan pembolehubah global dalam fungsi rekursif

Timbunan panggilan bagi fungsi rekursif bukan sahaja mengandungi parameter fungsi dan status berjalan, tetapi juga mengandungi semua pembolehubah yang digunakan dalam fungsi tersebut. Jika pembolehubah global digunakan dalam fungsi rekursif, nilai pembolehubah mungkin ditimpa. Oleh itu, apabila menulis fungsi rekursif, elakkan menggunakan pembolehubah global dan sebaliknya gunakan parameter fungsi atau pembolehubah tempatan.

Berikut ialah contoh fungsi rekursif yang salah yang menggunakan pembolehubah global:

$count = 0;

function count_nodes($node) {
  global $count;
  $count++;
  foreach ($node->children() as $child) {
    count_nodes($child);
  }
  return $count;
}

Fungsi ini mengira bilangan nod dalam dokumen XML, tetapi disebabkan penggunaan pembolehubah global $count, Nilai $count akan ditulis semula setiap kali semasa rekursi, akhirnya membawa kepada ralat mengira. Anda boleh menggunakan parameter fungsi untuk menggantikan pembolehubah global, seperti yang ditunjukkan di bawah:

function count_nodes($node, $count = 0) {
  $count++;
  foreach ($node->children() as $child) {
    $count = count_nodes($child, $count);
  }
  return $count;
}

Dalam fungsi ini, parameter fungsi $count digunakan untuk menggantikan pembolehubah global untuk memastikan ketepatan pengiraan.

Ringkasnya, fungsi rekursif mempunyai kelebihan besar dalam menyelesaikan masalah, tetapi ia juga boleh menyebabkan masalah yang serius. Apabila menulis fungsi rekursif, anda mesti mengikut beberapa peraturan, seperti syarat akhir yang jelas, elakkan kedalaman rekursif yang berlebihan, elakkan menggunakan pembolehubah global, dsb., untuk memastikan ketepatan dan keteguhan kod.

Atas ialah kandungan terperinci Elakkan gelung tak terhingga rekursif dalam pembangunan bahasa PHP. 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