2016-01-15 3 views
2

Почему программа не заканчивается после возврата и как ее завершить? https://ideone.com/9Lz6jy Примечание: Целью здесь является поиск медианы, если это помогает в понимании программы. Но мой вопрос - чистый C++. Не нужна помощь в поиске медианного. Пожалуйста, сосредоточьтесь на том, как я могу вернуть ответ, как только у меня это получится.Как завершить программу рекурсии 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; 
} 
+1

Почему вы не возвращаете значения на вызов 'Pivot2 () 'в условиях if-else if'? – Atri

+1

Вы должны включить предупреждения в свой компилятор. Если вы используете g ++, используйте -Wall. Это скажет вам, что вы не возвращаете значение со всех путей вашей функции Pivot2. Я вижу 3 места, где вам не хватает возврата. – AaronI

+0

Возможный дубликат [Рекурсивная функция не возвращает указанное значение] (http://stackoverflow.com/questions/27691547/recursive-function-does-not-return-specified-value) – Barmar

ответ

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

Смежные вопросы