【10】斐波那契数列的循环和递归实现

12人阅读 评论(0) 收藏 举报
分类:

面试题10:斐波那契数列

【0】目录:

【1】题目
【2】分析
【3】测试代码
【4】测试结果
【5】算法优劣分析

【1】题目:

写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。

斐波那契数列: 1,1,2,3,5,8,13,21,34,55,89 ……
这里写图片描述

【2】分析:

在斐波那契数列中,不难得出规律,当n > 2时,某个数等于前两位数之和,如: 2 = 1+ 1;3 = 1+ 2; 5 = 2 +3……
那么我们可以分为三个部分来求解,如下所示:
这里写图片描述

【3】测试代码:

#include<iostream>
using namespace std;
 //========================循环实现===============================
long long Fibonacci01(unsigned int n )
{
    int result[2]={0,1}; 
     if (n < 2)
        {
            return result[n];
         }
    long long fib1 = 0;
    long long fib2 = 1;
    long long fibn = 0;
    for(int i = 2; i<= n ;++i )
    {
        fibn = fib1+fib2;
        fib1 = fib2;
        fib2 =fibn;
    }
    return fibn;
}

//===========================递归实现================================
long long Fibonacci02(unsigned int n)
{
    if(n <= 0)
    {
        return 0;
    }
    if(n == 1)
    {
        return 1;
    }
    if(n >= 2)
        return Fibonacci02( n - 1)+Fibonacci02( n - 2) ;
}

//====================测试代码========================
void test()
{
    long long ret1 = 0,ret2 = 0 ;
    int  n = 0;
    printf("请输入待求斐波那契数的数:\n");
    scanf( "%d", &n );
    ret1 = Fibonacci01(  n );
    ret2 = Fibonacci02(  n ); 


    printf("循环实现第%d个斐波那契数ret1为: %lld\n",n, ret1);
    printf("递归实现第%d个斐波那契数ret2为: %lld\n",n, ret2);

}

int main()
{
    test();
    return 0;
}

【4】测试结果如下:

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

这里写图片描述

【5】算法优劣分析:

上面我们采用了循环和递归分别求第n个斐波那契数,那么这两种方式各有优缺点:
递归算法:
递归的本质是将一个难以解决的大问题分解成若干个小的模块,每个小模块再来求解;递归的底层是用栈来实现的;递归用来解决这个问题,显然是合适的;优点:代码量少,逻辑清晰、算法一目了然;缺点:在求斐波那契数列的时候,会大量的重复调用现象,如下图所示,( f ( 6 ) 计算了4次) 这些重复的操作会占用大量的时间,因此,当所求的斐波那契数过大时,效率不高,当输入40时,明显要等几秒,结果才会出来,当数字过大时,将无法计算;另外,在函数调用的时候,会开辟空间,而每个进程的栈容量都是有限的,这就容易造成栈溢出;显然,使用递归算法,那么,算法的时间复杂度O 是以n的指数的方式递增的;
这里写图片描述
循环算法:
只要递归能实现的地方,基本都可以通过循环实现,循环看似比较繁琐,但实际上,是最实用的一种方案,我们可以将已经得到的中间项保存起来,下次计算的时候,先查找一下,如果之前计算过了,就不再重复计算了,显然这种方法的时间复杂度为O(n)

查看评论

Web 前端工程师课程 10 周

Web 前端工程师课程介绍 https://edu.csdn.net/topic/web115
  • 2018年02月26日 14:42

斐波那契数列的递归与循环的算法实现

前半篇转载地址:http://blog.csdn.net/woshisap/article/details/7566946 斐波那契数列,但凡学过编程的童鞋们应该都懂,背景就不介绍了(就是大兔...
  • Micro_Ryan
  • Micro_Ryan
  • 2015-08-22 09:31:52
  • 4742

java递归实现斐波那契数列

/** *create Date:2016-12-23 *modified Date:2016-12-23 *modified by:shark *Description:斐波那契数列 **...
  • qq_35719697
  • qq_35719697
  • 2017-03-27 13:58:18
  • 413

python使用递归、尾递归、循环三种方式实现斐波那契数列

在最开始的时候所有的斐波那契代码都是使用递归的方式来写的,递归有很多的缺点,执行效率低下,浪费资源,还有可能会造成栈溢出,而递归的程序的优点也是很明显的,就是结构层次很清晰,易于理解     可以使...
  • Together_CZ
  • Together_CZ
  • 2017-07-27 19:12:51
  • 2716

Fibonacci (斐波那契数列)-循环,递归实现方式

Fibonacci (斐波那契数列)-循环,递归实现方式 #include long fibonacci(int ); long fibonacci_loop(int ); int m...
  • changgui5211
  • changgui5211
  • 2015-08-15 16:13:09
  • 1937

斐波那契数列Fibonacci实现(递归、尾递归、循环)

主要内容摘自http://www.cnblogs.com/Anker/archive/2013/03/04/2943498.html一、递归简单的来说递归就是一个函数直接或间接地调用自身,是为直接或间...
  • mengxiangjia_linxi
  • mengxiangjia_linxi
  • 2017-10-04 17:45:29
  • 286

C#斐波那契数列(递归算法)

namespace 递归算法 {     class Program     {         static void Main(string[] args)         {         }...
  • duanworld
  • duanworld
  • 2017-03-30 16:45:02
  • 766

斐波那契数列与阶乘---递归实现

package com.demo.hello; public class HelloWorld { //斐波那契数列--递归实现 public static int fibonacci(i...
  • cxc19890214
  • cxc19890214
  • 2015-05-27 14:58:29
  • 614

常见试题:利用递归打印前10个斐波那契数列

2016-08-26
  • php_worker
  • php_worker
  • 2016-08-26 19:38:46
  • 1696

斐波那契数列(递归实现)

一、问题描述:
  • Vivid_110
  • Vivid_110
  • 2014-09-21 11:07:18
  • 829
    个人资料
    持之以恒
    等级:
    访问量: 2万+
    积分: 1206
    排名: 4万+
    最新评论