递归和非递归实现第N个斐波那契数

题目描述:

求第n个斐波那契数,在本篇博客中讲述两种方法:
一是利用递归调用函数实现,
一种是非递归循环实现
首先要了解什么是斐波那契数列,斐波那契数列的特征是前两个数是1,其后数为前两数之和,如

这里写图片描述

这里写图片描述

一、递归实现

#include<stdio.h>
#include<stdlib.h>
int fib(int n)
{
    if(n<=2)
    {
        return 1;   //前两个数为1
    }
    else
    {
        return fib(n-1)+fib(n-2);  //第n个数值为前两数之和,形成函数调用
    }
}
int main()
{
    int n = 0;
    int ret = 0;
    printf("请输入要求的斐波那契项数n:\n");
    scanf("%d",&n);
    ret = fib(n);
    printf("第n个斐波那契数为:%d\n",ret);
    system("pause");
    return 0;
}

递归调用程序代码看起来简单,一目了然,可是如果要求数字序列大,在栈里函数重复调用,最后返回,计算时间较长,效率低下,所以我们要有选择性的使用递归。

为了提高效率,避免重复调用,代码运行开销过大,下面我们用循环实现,每次将数据保存,可避免重复计算,

这里写图片描述

二、循环实现

#include<stdio.h>
#include<stdlib.h>
int fib(int n)
{
    int a = 1;    //前两项均为1
    int b = 1;
    int c = 0;
    c = a + b;
    b = a ; 
    c = b ;
    while(n>2)   //循环条件
    {
        c = a + b;
        a = b;    //a,b均为前两项
        b = c;
        n--;
    }
    return c;
}
int main()
{
    int n = 0;
    int ret = 0;
    printf("请输入要求的斐波那契项数n:\n");
    scanf("%d",&n);
    ret = fib(n);
    printf("第n个斐波那契数为:%d\n",ret);
    system("pause");
    return 0;
}

运行结果
这里写图片描述

猜你喜欢

转载自blog.csdn.net/sister_wang0712/article/details/80037322
今日推荐