斐波那契数的两种实现方式———1.递归实现,2迭代实现

对于斐波那契数,若是采用递归的算法,每个递归调用都将触发另外两个递归调用,而这两个中调用任意一个还会触发另外两个的调用。递归调用的时间复杂度O(2^N),空间复杂度为O(N),所以在计算略大的数会花费一定的时间和空间。递归程序如下:

#include<iostream>
using namespace std;

unsigned long long Fib(size_t num)
{
    if (num < 2)
    {
        return num;
    }
    else
        return Fib(num - 1) + Fib(num - 2);
}
int main()
{
    unsigned long long ret = Fib(10);
    cout << ret << endl;
    system("pause");
    return 0;
}

用迭代方法计算第N 个斐波那契数,时间复杂度O(N),空间复杂度O(1),程序如下:

#include<iostream>
using namespace std;

unsigned long long Fib(size_t num)
{
    unsigned long long first = 0;
    unsigned long long second = 1;
    unsigned long long sum = 0;
    if (num < 2)
        return num;
    else
       for (size_t i = 2; i <= num; i++)
       {
           sum = first + second;
           first = second;
           second = sum;
       }
       return sum;
}

int main()
{
    unsigned long long ret = Fib(10);
    cout <<"Fibonacci(10)="<< ret << endl;
    system("pause");
    return 0;
}

时间: 2024-11-03 20:51:51

斐波那契数的两种实现方式———1.递归实现,2迭代实现的相关文章

算法笔记_001:斐波那契数的多种解法

本篇文章解决的问题来源于算法设计与分析课程的课堂作业,主要是运用多种方法来计算斐波那契数.具体问题及解法如下: 一.问题1: 问题描述:利用迭代算法寻找不超过编程环境能够支持的最大整数的斐波那契数是第几个斐波那契数.(Java: 231-1 for int, 263-1 for long) 解决方案:针对问题1,此处要使用迭代法来解决,具体实现代码如下: //用迭代法寻找编程环境支持的最大整数(int型)的斐波那契数是第几个斐波那契数 public static int max_int_iter

php 两种方式实现求 斐波那契数

使用递归方式. //使用递归方式求斐波那契数 public function fb($n){ // if( $n <=2){ return 1; }else{ return fb($n-1) + fb($n-2); } } 使用递推方式. //使用递推方式求斐波那契数 public function fb2($n){ // if( $n <=2){ return 1; } $t1 = 1;$t2 = 1; for($i=3;$i<$n;$i++){ $temp = $t1; $t1 =

UVA 11582 Colossal Fibonacci Numbers! 大斐波那契数

大致题意:输入两个非负整数a,b和正整数n.计算f(a^b)%n.其中f[0]=f[1]=1, f[i+2]=f[i+1]+f[i]. 即计算大斐波那契数再取模. 一开始看到大斐波那契数,就想到了矩阵快速幂,输出等了几秒钟才输出完,肯定会超时.因为所有计算都是要取模的,设F[i]=f[i] mod n.F[0]=F[1]=1.只要出现F[i]=F[i+1]=1,那么整个序列就会重复.例如n=3,则序列为1,1,2,0,2,2,1,0,1,1……第九项和第十项都等于1,所以之后的序列都会重复. 至

hdu 4893 Wow! Such Sequence!(线段树功能:单点更新,区间更新相邻较小斐波那契数)

转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4893 --------------------------------------------------------------------------------------------------------------------------------------------

斐波那契数与二分法的递归与非递归算法及其复杂度分析

1. 什么是斐波那契数? 这里我借用百度百科上的解释:斐波那契数,亦称之为斐波那契数列(意大利语: Successione di Fibonacci),又称黄金分割数列.费波那西数列.费波拿契数.费氏数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=Fn-1+Fn-2(n>=2,n∈N*),用文字来说,就是斐波那契数列列由 0 和 1 开始,之后的斐波那契数列系数就由之前的两数相加.特别指出:0不是第一

C语言用递归求斐波那契数,让你发现递归的缺陷和效率瓶颈

递归是一种强有力的技巧,但和其他技巧一样,它也可能被误用. 一般需要递归解决的问题有两个特点: 存在限制条件,当符合这个条件时递归便不再继续: 每次递归调用之后越来越接近这个限制条件. 递归使用最常见的一个例子就是求阶乘,具体描述和代码请看这里:C语言递归和迭代法求阶乘 但是,递归函数调用将涉及一些运行时开销--参数必须压到堆栈中,为局部变量分配内存空间(所有递归均如此,并非特指求阶乘这个例子),寄存器的值必须保存等.当递归函数的每次调用返回时,上述这些操作必须还原,恢复成原来的样子.所以, 基

HDU 1021(斐波那契数与因子3 **)

题意是说在给定的一种满足每一项等于前两项之和的数列中,判断第 n 项的数字是否为 3 的倍数. 斐波那契数在到第四十多位的时候就会超出 int 存储范围,但是题目问的是是否为 3 的倍数,也就是模 3 值为 0 ,考虑到余数只有0,1,2,而且每项由前两项求和得到,也就是说余数一定会出现循环的规律,从首项开始,前 8 项模 3 的结果是:1 2 0 2 2 1 0 1,接下来的两项模 3 的结果仍是 1 2 ,那么整个序列就呈现出以 8 为周期的特点,只要模 8 的结果为 3 或者 7 就输出

[LeetCode] 509. 斐波那契数

传送门:[LeetCode] 509. 斐波那契数 题目描述 斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列.该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - 2), 其中 N > 1. 给定 N,计算 F(N). 示例 1: 输入:2 输出:1 解释:F(2) = F(1) + F(0) = 1 + 0 = 1. 示例 2: 输入:3 输出:2 解释:F(3) = F

组合数学及其应用——斐波那契数

斐波那契数列是一个非常有名的数列,它有着各种各样神奇的性质并且和自然界有着千丝万缕的联系.通过这篇文章我们将详细的阐述这个看似简单的数列的背后蕴含的神奇性质. 引入斐波那契数的问题: 在一年的开始,把新生的雌雄一对兔子放进一个笼子里.从第二个月开始,每个月这个雌兔子胜出雌雄一对兔子.而每对新出生的雌雄兔子也从第二个月开始生兔子,确定一年后笼子里有多少对兔子? 分析:我们直接考虑通过递推的方法来得到这个问题的泛解(即任意个月后的数量都可以计算),我们记f[n]表示第n天的兔子数量,它的来源有两个: