递归函数错误还是太难计算?

时间:2015-08-19 21:11:31

标签: c++ recursion

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

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

此第一个函数使用硬编码值计算此多项式

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

}

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

1 个答案:

答案 0 :(得分:2)

几个问题:

  1. 如果您想测试数字是否介于两个值之间,则需要进行比较,而不是

  2. 逻辑运算符为||&&

  3. 执行递归调用时,您没有返回任何内容。您需要将该调用的结果与当前值组合。

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