2015-08-19 2 views
-3

Я создал три функции, которые предполагают, чтобы вычислить этот полином:Ошибка рекурсивной функции или слишком сложно вычислить?

(c[0]+T*(c[1]+T*(c[2]+T*(c[3]+T*(c[4]+T*(c[5]+T*(c[6]+T*(c[7]+T*(c[8]+T*(c[9]))))))))))

Это первая функция вычисляет этот многочлен, используя hardcored значения

double poly(double Temp) 
{ 
    double T = Temp; 
    double p = (c[0]+T*(c[1]+T*(c[2]+T*(c[3]+T*(c[4]+T*(c[5]+T*(c[6]+T*(c[7]+T*(c[8]+T*(c[9])))))))))) 
    return p; 
} 

Эта Вторая функция вычисляет этот многочлен итеративно

double poly2(double Temp) 
{ 
    double T = Temp; 
    double p = 1; 
    for(int i = 9; i >= 0; i--) 
    { 
     if(i < 9) 
     { 
      p*= T; 
      p+=c[i]; 
     } 
     else 
     { 
      p*=c[9]; 
     } 
    } 
    return p; 
} 

Эта Третья функция вычисляет это значение p olynomial рекурсивно

double poly3(double Temp, int i, double p) 
{ 
    double T = Temp; 
    double p1 = p; 
    if(i == 9) 
    { 
     p1*=c[9]; 
     poly3(Temp,i-1, p1); 
    } 
    else if(i < 9 | i > 0){ 
     p1*=T; 
     p1+=c[i]; 
     poly3(Temp,i-1, p1); 
    } 
    else if(i == 0) 
    { 
     p1*=T; 
     p1+=c[0]; 
     return p1; 
    } 

} 

MAIN

int main() { 
    cout << std::setprecision(15) << poly(15) << endl; 
    cout << std::setprecision(15) << poly2(15) << endl; 
    cout << std::setprecision(15) << poly3(15, 9, 1) << endl; 
    return 0; 
} 

Проблема в том, что первые две функции возвращают один и тот же результат, но третья функция заставляет компилятор тайм-аут. Я размышлял о логике, но я просто не могу понять. Я не знаю, есть ли ошибка, или просто требуется слишком много времени для вычисления, но если вы видите ошибку, можете ли вы помочь мне решить ее. Большое спасибо!

Ideone Compiler Example

+2

«заставляет компилятор тайм-аут.» Я думаю, что ты не имел в виду, что. – Rishav

+0

@RishavKundu я должен исправить себя язь дал „Ограничение по времени превышен“ предупреждение –

+3

ли вы, возможно, хотите '||', а не '' '? –

ответ

2

Несколько проблем:

  1. Если вы хотите проверить, является ли число между двумя значениями, вам нужно и сравнений, а не или их.

  2. Логические операторы: || и &&.

  3. Вы не возвращаете ничего, когда выполняете рекурсивные вызовы. Вам нужно совместить результат этого вызова с текущим значением.

double poly3(double Temp, int i, double p) 
{ 
    double T = Temp; 
    double p1 = p; 
    if(i == 9) 
    { 
     p1*=c[9]; 
     return poly3(Temp,i-1, p1); 
    } 
    else if(i < 9 && i > 0){ 
     p1*=T; 
     p1+=c[i]; 
     return poly3(Temp,i-1, p1); 
    } 
    else if(i == 0) 
    { 
     p1*=T; 
     p1+=c[0]; 
     return p1; 
    } 

} 
+0

необходимо для этого оператора возврата p1 + poly3 (Temp, i-1, p1)? –

+0

Думаю, что - как еще вы объедините результат рекурсивного вызова с текущим элементом? – Barmar

+0

На самом деле это может потребоваться умножить, а не добавлять. Формула сбивает с толку. – Barmar

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