我必须使用递归函数对数组进行升序排序。因此,例如给定输入
5 | 12 31 48 25 50
输出必须是
5 | 12 25 31 48 50
开头的数字是数组的大小。
我已经生成了这段代码(它必须使用递归函数):
#include <iostream>
using namespace std;
int minimo(int *A, int lung) {
if (lung == 1)
return A[0];
int k = minimo(A+1, lung-1);
return A[0] < k ? A[0] : k;
}
//sort function
void ordina(int *A, int lung) {
if (lung > 0) {
cout << minimo(A, lung) << " ";
ordina(A+1, lung-1);
}
}
int main() {
int lung;
int A[100];
cin >> lung;
for(int i = 0; i < lung; i++) {
cin >> A[i];
}
//print array
ordina(A, lung);
return 0;
}
代码与上面的输入配合得很好,但是当我尝试使用负输入格式时,例如:
7 | 73 49 12 37 23 -14 -14
输出是:
7 | -14 -14 -14 -14 -14 -14 -14
你能解释一下为什么吗?
ordina
函数调用自身;我减少了长度并增加了 A+1
,这样 min 就不会在同一数组切片上计算多次。还有
return A[0] < k ? A[0] : k;
这里我检查 A[0] 中的项目是否低于 k 但 k 每次都改变,因为递归函数在每个“循环”的堆栈上都有不同的变量。我真的不明白为什么 -14 输入不起作用。有什么想法吗?
最佳答案
这会返回位置(返回前递增),必要时交换。
#include <iostream>
using namespace std;
int minimo(int* A, int length) {
if (length ==1) {
return 0;
} else {
int position = minimo(A+1,length-1)+1;
if (A[0]<A[position]) {
return 0;
} else {
std::swap(A[0],A[position]);
return 0;
}
}
}
void ordina(int* A,int length) {
if (length>0) {
cout<< A[minimo(A,length)]<< " ";
ordina(A+1,length-1);
}
}
int main() {
int lung;
int A[100];
cin >> lung;
for(int i = 0; i < lung; i++) {
cin >> A[i];
}
//print array
ordina(A, lung);
return 0;
}
但是,它始终返回位置 0,因此这不是代码的最终形式。不断发展的代码不返回任何东西:
void minimo(int* A, int length) {
if (length > 1) {
minimo(A+1,length-1);
if (A[0]>A[1]) {
std::swap(A[0],A[1]);
}
}
}
void ordina(int* A,int length) {
if (length>0) {
minimo(A,length);
cout<< A[0]<< " ";
ordina(A+1,length-1);
}
}
关于c++ - 带负数的递归最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43811989/