用c++的方式使用递归思想查找年龄问题。在当前疫情形势下,在医院收治的感染患者中利用分治法设 计查找病患序列中的年龄最大和最小的患者;
时间: 2024-02-01 07:16:56 浏览: 71
C 语言程序设计:递归与分治策略.ppt
首先我们需要定义一个患者类,包含患者的姓名和年龄:
```cpp
class Patient {
public:
string name;
int age;
Patient(string n, int a): name(n), age(a) {}
};
```
接下来,我们可以使用递归的思想来查找年龄问题。假设我们有一个存储患者信息的数组 `patients`,其中 `start` 表示起始位置,`end` 表示结束位置,则可以定义以下递归函数:
```cpp
// 查找年龄最大和最小的患者
void findAgeMinMax(Patient* patients[], int start, int end, Patient*& minAge, Patient*& maxAge) {
if (start == end) { // 只有一个患者
minAge = patients[start];
maxAge = patients[start];
} else if (start + 1 == end) { // 只有两个患者
if (patients[start]->age < patients[end]->age) {
minAge = patients[start];
maxAge = patients[end];
} else {
minAge = patients[end];
maxAge = patients[start];
}
} else { // 多于两个患者
int mid = start + (end - start) / 2;
Patient* leftMin;
Patient* leftMax;
findAgeMinMax(patients, start, mid, leftMin, leftMax);
Patient* rightMin;
Patient* rightMax;
findAgeMinMax(patients, mid + 1, end, rightMin, rightMax);
if (leftMin->age < rightMin->age) {
minAge = leftMin;
} else {
minAge = rightMin;
}
if (leftMax->age > rightMax->age) {
maxAge = leftMax;
} else {
maxAge = rightMax;
}
}
}
```
这个函数的思想是将数组一分为二,分别找到左半部分和右半部分的最小年龄和最大年龄,然后比较左右两部分的最小和最大年龄,得到整个数组的最小和最大年龄。
最后,我们可以这样调用这个函数:
```cpp
int main() {
Patient* patients[] = {
new Patient("A", 20),
new Patient("B", 30),
new Patient("C", 25),
new Patient("D", 35),
new Patient("E", 28),
};
Patient* minAge;
Patient* maxAge;
findAgeMinMax(patients, 0, 4, minAge, maxAge);
cout << "Min age: " << minAge->age << ", patient: " << minAge->name << endl;
cout << "Max age: " << maxAge->age << ", patient: " << maxAge->name << endl;
return 0;
}
```
输出结果如下:
```
Min age: 20, patient: A
Max age: 35, patient: D
```
注意,这里我们只查找了数组中 0-4 的位置,如果要查找整个数组,只需要将 `end` 设置为数组长度减一即可。
阅读全文