c++ 我的if条件正确吗?它能将偶数斐波那契数列相加到400万?

xeufq47z  于 2022-12-15  发布在  其他
关注(0)|答案(1)|浏览(91)

从1和2开始,计算所有偶数斐波那契数的和(当这些数小于或等于4百万时)
我试着把所有偶数斐波那契数列相加到4e6,但是它没有给予我任何正确的结果,我不知道我哪里搞砸了,在我看来,if的条件是正确的。
下面是我的fibonacci()函数,也就是对偶数求和的函数。

int fibonacci(int k) //compute the k-th fibonacci number (with EulerProject formula)
{
    if (k == 1 || k == 2)
    {
        return k;
    }
    {
        return (fibonacci(k-1)+ fibonacci(k-2));
    }
}
int evenfibonacci()
{
    int result = 0;
    for (int k = 1; fibonacci(k)<=4e6;) {
        if (fibonacci(k)%2 == 0 ) {
            result += fibonacci(k);
            k++;
        } else {
            k++;
        }
    }
}
kwvwclae

kwvwclae1#

evenfibonacci()声明为返回int值,但实际上return没有任何内容,这是 undefined behavior。因此,返回值总是 indeterminate,它最终返回随机垃圾,这就是为什么您永远不会得到好结果的原因。
您需要添加return语句,例如:

int evenfibonacci()
{
    int result = 0;
    for (int k = 1; fibonacci(k) <= 4e6; ++k) {
        if (fibonacci(k) % 2 == 0) {
            result += fibonacci(k);
        }
    }
    return result; // <-- ADD THIS
}

Online Demo
也就是说,每次循环迭代调用fibonacci(k) 3次是非常低效的,因为要反复计算相同的值,尤其是对于k的较大值。

int evenfibonacci()
{
    int result = 0;
    for (int k = 1; k <= 33; ++k) {
        int value = fibonacci(k);
        if (value % 2 == 0) {
            result += value;
        }
    }
    return result;
}

Online Demo
当然,更好的解决方案是完全去除fibonacci(),而代之以使用迭代方法来每次迭代仅计算新值,例如:

int evenfibonacci()
{
    int result = 2;
    int last[2] = {1, 2};
    for (int k = 3; k <= 33; ++k) {
        int value = last[0] + last[1];
        if (value % 2 == 0) {
            result += value;
        }
        last[0] = last[1];
        last[1] = value;
    }
    return result;
}

Online Demo

相关问题