递归函数错误或太难计算



我创建了三个函数来计算这个多项式:

(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]))))))))))

This First Function使用硬核值计算这个多项式

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

第三个函数递归地计算这个多项式

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;
    }
}
主要

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编译器示例

几个问题:

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

最新更新