为什么for-loop在向上计数和向下计数时表现不同?

时间:2016-03-17 10:13:14

标签: c++ for-loop factorial

这是我最近重新审视的家庭作业问题。它要求我不要使用cmath并编写一个函数来评估cos pi/3。代码是

#include <iostream>
using namespace std;

double power(double x, int b) {
    if (b>1) return x*power(x,b-1);
    else if (b==0) return 1;
    else return x;
}

double cosine(double x, int k) {
    double tmp=0;
    for (int n=0; n<=k; n++) {
        tmp += power(-1,n) / factorial(2*n) * power(x,2*n);
    }
    return tmp;
}

int main() {
    double x=3.1415/3; 
    int k=100;
    cout << cosine(x,k) << endl;
}

我已经使用for循环编写了两个版本的double factorial(int a)

一个计数并成功输出0.500027

double factorial(int a) {
    double tmp=1;
    for (int i=1; i<=a; i++) {
        tmp*=i;
    }
    return tmp;
}

另一个倒计时并输出inf(但成功评估4!= 24):

double factorial(int a) {
    double tmp=a;
    for (int i=a; i>=1; i--) {
        tmp*=i;
    }
    return tmp;
}

为什么倒计时循环无法提供收敛输出?

1 个答案:

答案 0 :(得分:1)

第二个factorial()两次乘以a。试试这个:

double factorial(int a) {
    double tmp=1; // use 1 instead of a
    for (int i=a; i>=1; i--) {
        tmp*=i;
    }
    return tmp;
}

请注意,使用double tmp=a;并将i初始化为a-1并不好,因为它会生成factorial(0) = 0,而factorial(0)应为1。

第一个实现也将1乘以2,但乘以1不会影响结果。