C语言递归 —— 求斐波那契数列的n项

众所周知,斐波那契数列 是一个特殊的数列

如1,1,2,3,5,,,,n;第三项等于他的前两项之和 推导出递推公式就是

“f(n) = f(n - 1) + f(n - 2)”

那么我们今天就利用此公式来求取斐波那契数列的第n项 具体是如何实现的呢

码上见分晓

//斐波那契数列 求第n项

//递归

int DG(int n)
{
    if (n >= 3)//根据上面的例子设置的条件限制 如果给上边的例子前加0 这里的n也可以是大于等于2
    {
        return DG(n - 1) + DG(n - 2);//有没有想到上面的地推公式
    }//有没有感觉从后往前算 他不知道前面是什么数 不断地分支(就像树杈)知道推到最开始的数
    else
    {
        return 1;
    }
}

int main()
{
    int  n = 0;
    scanf("%d", &n);
    int d = DG(n);
    printf("%d", d);
    return 0;
}
C语言递归 —— 求斐波那契数列的n项_第1张图片

改代码有个弊端 就是计算了很多重复项

所以说但他计算的项数较大时他会消耗太多时间 降低效率 那么递归就不适合求(不是不能求)

既然不能用递归 那么就用其他方法(条条大道通罗马)

那我们试一试循环(从前往后计算)

将前两个数加起来赋给第二个数 再将第二个数赋给第一个数 如此反复

但思考该过程 你会发现 并没有重复计算那一个项

//非递归(循环迭代)

int DG(int n)
{
    int a = 1;
    int b = 1;
    int c = 1,i = 3;
    while (i <= n)
    {
        c = a + b;
        a = b;
        b = c;
        i++;
    }
    return c;//n小于3时返回1 大于等于时返回相加之后的值 (和递归的n >= 3讲解一样)
}

int main()
{
    int n = 0;
    scanf("%d", &n);
    int d = DG(n);
    printf("%d", d);
    return 0;
}

运行之后的效果就不演视了 图片上传失败

相比之下 循环的代码效率更高 可以计算较大的项

这就是这次的讲解 加油铁汁~

你可能感兴趣的:(每日一题,c++,c语言,开发语言)