如何使C ++递归程序终止

时间:2016-01-15 23:08:49

标签: c++ recursion

为什么程序在返回后不会终止以及如何终止它? 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;
}

2 个答案:

答案 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 );
    }
}