斐波那契数列递归与非递归时间复杂度
问题
来自王道考研数据结构书籍,思维拓展
斐波那契数列有两种常用的算法:递归算法和非递归算法。试分别分析两种算法的时间复杂度。
递归方式
递归方式代码:
递归结束条件可以不同,如果数列从第一个开始且为1,那么就是如下结束条件。
如果从第0个开始且第0个为0,那么结束条件就会改变:n等于0时返回0,n等于1时返回1
#include <stdio.h>
#include <stdlib.h>int Fibonacci(int n){if(n==1||n==2)return 1;elsereturn Fibonacci(n-1)+Fibonacci(n-2);
} int main(int argc, char *argv[]) {int n;scanf("%d",&n);int result = Fibonacci(n);printf("%d",result);return 0;
}
时间复杂度可通过下图分析:
如果是一个满二叉树的话,其时间复杂度就是O(2^n)。但实际上并不是满二叉树,所以比这个要小一点。网上有确切的值以及推导过程,大家可以看看。
非递归方式
代码如下:
#include<stdio.h>
#include<stdlib.h>int Fibonacci(int n){if(n<=2){return 1;}else{int num1=1;int num2=1;int i;for(i=2;i<n;i++){num2=num1+num2;num1=num2-num1;}return num2;}
}int main(){int n;scanf("%d",&n);int result=Fibonacci(n);printf("%d",result);
}
直接看for循环即可,语句重复执行的次数是n的数量级,所以时间复杂度为O(n)。
斐波那契数列递归与非递归时间复杂度相关推荐
- 斐波那契数列递归算法和非递归算法以及其时间复杂度分析
1.在学习数据结构这门课的过程中,发现斐波那契数列的递归算法以及非递归算法,以及其时间复杂度分析是一个小难点.所以特别总结一下. 斐波那契数列的表达式: Fibonacci数列简介: F(1)=1 F ...
- 计算斐波那契数列递归算法和非递归算法的比较
对于斐波那契数列的计算是计算机算法经典问题,常见的算法有递归算法和非递归算法两种,那么它们之间的不同应该如何对比? 本文用python为例,比较两种不同算法的时间复杂度等不同 代码比较 递归算法: # ...
- ----斐波那契数列---eval函数----类递归思想 栈 进出 思想
------------ 斐波那契 数列 --------------- [1,1,2,3,5,8,13,21,34,...] 1 列表方法实现 # l=[1,1] # # # while len(l ...
- [剑指offer][JAVA]面试题第[10-1]题[斐波那契数列][动态规划][记忆化递归]
[问题描述][中等] 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项.斐波那契数列的定义如下:F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N ...
- 递归——阶乘加斐波那契数列(简单掌握递归思想的敲门砖)
话不多说,先上源码: 阶乘: #include<iostream> #include<bits/stdc++.h> using namespace std;int JieChe ...
- 递归法 最大公倍数 斐波那契数列 数组插入排序改递归
辗转相除法: 例如:m%n=0;能够整除则n为最大公倍数 若m%n=k,不能够整除的话,继续辗转相除变为n%k 若n%k=c,不能整除的话继续这样- 核心代码 static int gcd(int m ...
- C++:斐波那契数列(迭代和递归)
[问题引入] 斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为"兔子 ...
- 斐波拉契数列的递推递归求解算法
介绍: 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为"兔子数 ...
- 斐波那契数列递归算法与非递归算法
斐波那契数列,又称黄金分割数列,因数学家列昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为"兔子数列". 斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, ...
- 斐波那契数列(Fibonacci)递归和非递归实现
序列前9项为:0, 1, 1, 2, 3, 5, 8, 13, 21 要注意非递归的话就是那一个变量帮助存储当前下一项的值,然后依次挪动两个指针往下即可 注意如果n太大 会溢出 1 publ ...
最新文章
- c#值类型和引用类型
- 实例讲解sed的9种常见用法
- 服务端程序的初步实现
- 从银行网点拒绝普通客户 看互联网银行的“微众市场
- 拖拽元素自定义html模板,JS实现的自定义网页拖动类
- 输入某年某月某日,Java判断这一天是这一年的第几天?
- python从入门到放弃-《Python3从入门到放弃》视频教程
- AD19改变原理图图纸大小(A4改为A3
- 用python将word文档导入数据库_python读取word文档,插入mysql数据库实例
- mysql服务性能优化—my.cnf配置说明详解
- Java学习笔记 --- IDEA
- 大象英语-电脑键盘练习工具儿童版(学英语、学电脑)
- 《网页配色密码》 一本易读实用的好书
- fash 3D 游戏
- 第二层、三层、四层交换机原理
- 猴年猴赛雷,曙光服务器全面升级E5-v4平台
- 判断是手机还是平板html,“吃鸡”用平板好还是手机好?大神给出了答案,不同理解不同格局...
- 四舍五入VS银行家舍入 (四舍六入五取偶)
- 推荐系统与深度学习(一)——FM模型原理
- 对比语法错误、语义错误以及运行时错误