为什么程序在返回后不会终止以及如何终止它? https://ideone.com/9Lz6jy 注意:这里的目的是找到中位数,如果这有助于理解程序。但我的问题是纯粹的C ++相关。找到中位数无需帮助。请关注我如何在得到答案后回复答案。
#include <iostream>
#include <time.h>
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
#include <assert.h>
using namespace std;
int Pivot2(vector<int> &v, int pivot) {
vector<int> v_copy(v.size());
//int pivot = v.size() / 2;
//1. Sort the array about the mid term
int count_less = 0;
int j = 0;
for (unsigned int i = 0; i <v.size() ; i++) {
if (v[i]< v[pivot]) {
v_copy[j]=v[i];
j++;
count_less++;
}
}
v_copy[j]=v[pivot];
j++;
for (unsigned int i = 0; i <v.size(); i++) {
if (v[i]> v[pivot]) {
v_copy[j] = v[i];
j++;
}
}
//2. if the number of less than than tmp_med increase the middle postion
if ( count_less > v.size() / 2) {
Pivot2(v_copy,count_less-1);
}
else if (count_less == v.size() / 2) {
cout <<"inner " << v[pivot] <<endl ;
return v[pivot]; //Why the recursion does not terminate with this return?
}
else {
if ( count_less < v.size() / 2) {
Pivot2(v_copy, count_less + 1 );
}
}
}
int main() {
// your code goes here
int arr[] = { 8, 7, 3, 1, 9, 4, 6, 5, 2};
int n = sizeof(arr) / sizeof(arr[0]);
//randomize(arr, n);
vector<int> v( begin(arr), end(arr) );
int med1 = Pivot2(v,v.size()/2);
assert(5 == med1);
cout << med1 <<endl ;
return 0;
}
答案 0 :(得分:0)
首先,在有符号和无符号整数表达式之间进行多次比较时,启用编译器警告。即:if ( count_less > v.size() / 2) {
然后您需要返回您创建的Pivots
return Pivot2(v_copy,count_less - 1);
^^^^^^^^
.....
return Pivot2(v_copy, count_less + 1 );
^^^^^^
另外,请注意您的功能reaches end of non-void function
。只需删除if ( count_less < v.size() / 2) {
即可。即:
else {
return Pivot2(v_copy, count_less + 1 );
}
您可以在Coliru
上查看此版本答案 1 :(得分:0)
您需要在此块中返回所有条件中的值:
if ( count_less > v.size() / 2) {
return Pivot2(v_copy,count_less-1);
}
else if (count_less == v.size() / 2) {
cout <<"inner " << v[pivot] <<endl ;
return v[pivot]; //Why the recursion does not terminate with this return?
}
else {
if ( count_less < v.size() / 2) {
return Pivot2(v_copy, count_less + 1 );
}
}