斐波那契数列两种时间复杂度

契数列

概述:

  斐波那契数列,又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1963起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。

求解:

求解斐波那契数列的F(n)有两种常用算法:递归算法和非递归算法。试分析两种算法的时间复杂度。

1 递归算法


1

2

3

4

5

6

7

8

9

10

11

12

#!/usr/bin/env python

# -*- coding:utf-8 -*-

def fibonacci(n):

    if == 0:

        return 0

    elif n <= 2:

        return 1

    else:

        return fibonacci(n-1+ fibonacci(n-2)

fibonacci(100)

时间复杂度:求解F(n),必须先计算F(n-1)和F(n-2),计算F(n-1)和F(n-2),又必须先计算F(n-3)和F(n-4)。。。。。。以此类推,直至必须先计算F(1)和F(0),然后逆推得到F(n-1)和F(n-2)的结果,从而得到F(n)要计算很多重复的值,在时间上造成了很大的浪费,算法的时间复杂度随着N的增大呈现指数增长,时间的复杂度为O(2^n),即2的n次方 

2 非递归算法


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

#!/usr/bin/env python

# -*- coding:utf-8 -*-

def fibonacci(n):

    if == 0:

        return 0

    elif n <= 2:

        return 1

    else:

        num1 = 1

        num2 = 1

        for in range(2,n-1):

            num2 = num2 + num1

            num1 = num2 - num1

        return num1 + num2

print(fibonacci(100))

算法复杂度:从n>2开始计算,用F(n-1)和F(n-2)两个数相加求出结果,这样就避免了大量的重复计算,它的效率比递归算法快得多,算法的时间复杂度与n成正比,即算法的时间复杂度为O(n)

原文地址:https://www.cnblogs.com/chengjian-physique/p/8563014.html

时间: 2024-09-29 00:43:39

斐波那契数列两种时间复杂度的相关文章

斐波那契的两种实现方式

斐波那契数列,又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)在现代物理.准晶体结构.化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1960年代起出版了<斐波纳契数列>季刊,专门刊载这方面的研究成果. #include<stdio.h> /* 解决斐波那契数列问题: 斐波那契数列指的是这样一个数列 0, 1,

Talking About斐波那契数列(三种实现方法)

一直学习数据结构和算法,虽然学的没有太好,但还是觉得应该做一些有意思的程序来实现以下~牛客网(大哥推荐,还有就是..不要问我大哥是谁~~)有剑指Offer系列很多的题目,不管是大神还是..应该去做一下,感受编程的魅力~~(首先承认自己还是有很多不足的地方,但尽量去完善每一行代码~)  废话少说,代码搞起~ import java.util.Scanner; /** * 现在要求输入一个整数n,请你输出斐波那契数列的第n项. * 斐波那契数列,又称黄金分割数列,指的是这样一个数列 0, 1, 1,

斐波那契数列三种实现(上台阶)-Python

1.递归 # 递归 def fibs(n): if n < 1: return 0 elif n == 1: return 1 return fibs(n - 2) + fibs(n - 1) print(fibs(6)) 2.循环 # 循环 def fibs(n): a = [1, 1] for i in range(n - 2): a.append(a[-2] + a[-1]) return a[n-1] print(fibs(6)) class Solution: def fib(self

斐波那契的两种实现方法

#include <stdio.h> int fib(int n) { int a = 1; int b = 1; int c = a = b; int i = 0; for (i = 3; i <= n; i++) { c = a + b; a = b; b = c; } return c; } int main() { printf("%d\n", fib(10000)); getchar(); return 0; } 非递归方法 #include <std

斐波那契数列递归的时间复杂度

f(n)=f(n-1)+f(n-2) 二阶常系数差分方程,解得: 当n趋于无穷大,后面的加数趋于0,则约等于O(1.618^n),即如O(2^n)级别 其实可以树状展开看下,顶层是f(n),之后每层翻倍,则所有子节点的和约为2^n级别,但不会满二叉,所以比这小点. 原文地址:https://www.cnblogs.com/willaty/p/11396840.html

斐波那契数列(C++ 和 Python 实现)

(说明:本博客中的题目.题目详细说明及参考代码均摘自 "何海涛<剑指Offer:名企面试官精讲典型编程题>2012年") 题目 1. 写一个函数,输入 n, 求斐波那契(Fibonacci)数列的第 n 项.斐波那契数列的定义如下: 2. 一只青蛙一次可以跳上 1 级台阶,也可以跳上 2 级.求该青蛙跳上一个n级的台阶总共有多少种跳法? 3. 一只青蛙一次可以跳上 1 级台阶,也可以跳上 2 级,...... ,也可以跳上n级,此时该青蛙跳上一个 n 级的台阶共有多少种跳法

斐波那契数列问题的两种解决方法

斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368........ 这个数列从第3项开始,每一项都等于前两项之和. 简单来说,斐波那契数列可以用下面这个公式来表示. { 0 ,n=0 f(n)={ 1 ,n=1 { f(n-1)+f(n-2) ,n>1 关于斐波那契数列衍生的算法题层出不穷,比如青蛙跳台阶问题等(

斐波那契数列的三种时间复杂度

/*前边两个为一种做法*/ /*后边有另外的做法(差分方程以及利用矩阵去做)*/ //***************************************************//***************************************************//*************************************************** 第一种做法 这是2018王道数据结构考研复习指导的第一章思维拓展的题目. 关于斐波那契数列的简介:

Python 两种方式实现斐波那契数列

斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368...... 这个数列从第3项开始,每一项都等于前两项之和. 递归的方式实现: def fn(n): if n==1: return 1 elif n==2: return 1 else: return fn(n-1)+fn(n-2) n=int(input())