gpt4 book ai didi

php - 如何使用循环编写递归

转载 作者:行者123 更新时间:2023-11-29 09:55:47 24 4
gpt4 key购买 nike

我想使用循环而不是递归函数来编写递归代码。因为递归需要太多时间来执行,甚至失败。这是使用递归对二叉树两侧的用户进行计数。我想使用循环来实现此任务。请帮助我完成这项任务。提前致谢。我将非常感谢你。

    function countActiveMembers($mid){
if ($mid == null) {
return 0;
}
$c = 0;

include("conn.php");
$query = $conn->prepare('SELECT leftm, rightm, package_choose FROM member WHERE user_id = ?');
$query->bind_param('s', $mid);
$query->execute();
$query->bind_result($leftm, $rightm, $package_choosen);
if ($query->fetch()) {
$query->close();
$conn->close();

if ($package_choosen == 1) {
$c = 0;
} else {
$c = 1;
}

if (isset($leftm) == false && isset($rightm) == false) {
return $c;
}


if (isset($leftm)) {
$c = $c + countActiveMembers($leftm);
}
if (isset($rightm)) {
$c = $c + countActiveMembers($rightm);
}
} else {
$query->close();
$conn->close();
}
return $c;
}

function countLeftActive($mid){
if ($mid == null) {
return 0;
}
$c = 0;
include("conn.php");
$query = $conn->prepare('SELECT leftm, rightm, package_choose FROM member WHERE user_id = ?');
$query->bind_param('s', $mid);
$query->execute();
$query->bind_result($leftm, $rightm, $package_choosen);
if ($query->fetch()) {
$query->close();
$conn->close();

if (isset($leftm) == false && isset($rightm) == false) {
return 0;
}

if (isset($leftm)) {
$c = $c + countActiveMembers($leftm);
}
} else {
$query->close();
$conn->close();
}
return $c;
}
function countRightActive($mid){
if ($mid == null) {
return 0;
}
$c = 0;
include("conn.php");
$query = $conn->prepare('SELECT leftm, rightm, package_choose FROM member WHERE user_id = ?');
$query->bind_param('s', $mid);
$query->execute();
$query->bind_result($leftm, $rightm, $package_choosen);
if ($query->fetch()) {
$query->close();
$conn->close();
if (isset($leftm) == false && isset($rightm) == false) {
return 0;
}

if (isset($rightm)) {
$c = $c + countActiveMembers($rightm);
}
} else {
$query->close();
$conn->close();
}
return $c;

}

最佳答案

我希望您能够意识到这是很难测试的,所以希望您能够理解它以提供帮助。

任何系统中最大的性能问题之一是文件/数据库访问以及打开和关闭连接等始终是一个缓慢的过程。此例程在开始时加载所有成员并传递数据,而不是持续使用数据库...

function countActiveMembers( $members, $mid){
if ($mid == null) {
return 0;
}
$c = 0;

// Fetch the data from the $members list, using $mid as the index
$leftm = $members[$mid]['leftm'];
$rightm = $members[$mid]['rightm'];
$package_choosen = $members[$mid]['package_choose'];
if ($package_choosen == 1) {
$c = 0;
} else {
$c = 1;
}

if (isset($leftm) == false && isset($rightm) == false) {
return $c;
}

if (isset($leftm)) {
$c = $c + countActiveMembers($members, $leftm);
}
if (isset($rightm)) {
$c = $c + countActiveMembers($members, $rightm);
}
return $c;
}

function countLeftActive($members, $mid){
if ($mid == null) {
return 0;
}
$c = 0;
$leftm = $members[$mid]['leftm'];
$rightm = $members[$mid]['rightm'];

if (isset($leftm) == false && isset($rightm) == false) {
return 0;
}

if (isset($leftm)) {
$c = $c + countActiveMembers($members, $leftm);
}
return $c;
}
function countRightActive($members, $mid){
if ($mid == null) {
return 0;
}
$c = 0;
$leftm = $members[$mid]['leftm'];
$rightm = $members[$mid]['rightm'];
if (isset($leftm) == false && isset($rightm) == false) {
return 0;
}

if (isset($rightm)) {
$c = $c + countActiveMembers($members, $rightm);
}
return $c;

}

// Use your own database credentials
$conn = mysqli_connect("172.17.0.3", "root","a177fgvTRw", "test" );
$result = $conn->query('SELECT user_id, leftm, rightm, package_choose
FROM member');
$members = [];
// Read all the members in and index them by the user_id
while ($row = $result->fetch_assoc()) {
$members[$row["user_id"]] = $row;
}

// Not entirely sure how you use it,but this shows passing the members into the start function
echo countActiveMembers($members, 1);

关于php - 如何使用循环编写递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53897972/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com