Day 7:斐波那契数列
剑指Offer_编程题——斐波那契数列
题目描述:
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39
具体要求:
时间限制: C/C++ 1秒,其他语言2秒 空间限制: C/C++32M,其他语言64M
具体思路:
概念介绍 斐波那契数列是一个很经典的问题,大多学计算机的都知道,它是由著名数学家列昂纳多·斐波那契而命名的。它也称之为黄金分割数列。它的由来是从兔子的繁殖而引进来的,因此也称之为“兔子数列”。从第三项起,前两项之和即为第三项,其通项为F(n) = F(n - 1)+ F(n - 2).例如:这样的一个数列:1 1 2 3 5 8 13 21 34……就是斐波那契数列。 实现思路 实现斐波那契数列需要进行经典的算法——递归。但是递归也是有技巧,如果我们只是单纯的进行递归,不进行任何的优化,则时间和空间复杂度为指数级别的,随着n的不断增长,时间的消耗和空间呈爆炸型增长。因此即使我们用递归也要对通项进行优化。其实在计算过程中,我们不难发现,前两项这和为第三项,之所以直接递归有那么大的复杂度,是因为它每计算新的一项,总会重复计算前一项,因此,我们只需要定义一个新的变量来保存这个之前计算好的值,时间和空间复杂度就降下来了。 我们分别用java和python来实现这个思路。 1、我们首先用java来实现这个代码
public class Solution{
public int Fibonacci(int n){
if (n <= 1){
return n;
}
int res = 0;
int n1 = 0;
int n2 = 1;
for(int i = 2; i <= n; i++){
res = (n1 + n2);
n1 = n2;
n2 = res;
}
return res;
}
}
代码效果图如图所示:
2、我们用Python来实现
class Solution:
def Fibonacci(self, n):
a = 0
b = 1
for i in range(n):
a, b = b ,a + b
return a
其效果图如图所示:
我们可以通过改善一下以上的代码,适当的缩减代码的运行时间复杂度,当然,空间就比之前的要占用多了,这就是典型的“以空间换时间”的思想。具体改进代码如下:
class Solution:
def Fibonacci(self, n):
a, b = 0, 1
for i in range(n):
a, b = b, a + b
return a
其效果图如图所示:
与上面的代码相比较,只是优化了一行代码,时间复杂度确降低了接近一半,当然与之对应的空间就扩大了将近一倍。
总结
本道题通过一个典型的斐波那契数列问题来考察我们对递归的应用,因此在做该题之前,我们应该了解斐波那契数列,其次要熟练掌握递归思想。在最后我们运用了常见的“以空间换时间”的思想来改进了算法,其效果很明显。继续加油,争取早日找到工作,Good Luck!!!
- 数据库连接字符串的处理方法!加密解密连接字符串。
- ASP.net实现无扩展名的URL重写。简单、方便、无需ISAPI。
- 通过自定义ServiceHost实现对WCF的扩展[实例篇]
- 通过自定义ServiceHost实现对WCF的扩展[原理篇]
- python使用rsa库做公钥解密(网上别处找不到)
- 通过“四大行为”对WCF的扩展[原理篇]
- WCF客户端运行时架构体系详解[下篇]
- WCF客户端运行时架构体系详解[上篇]
- WCF服务端运行时架构体系详解[续篇]
- [WCF-Discovery] 实例演示:如何利用服务发现机制实现服务的“动态”调用?
- [WCF-Discovery]服务如何能被”发现”
- 我的数据访问函数库的源代码(一)—— 共用部分
- 《WCF服务编程》关于“队列服务”一个值得商榷的地方
- 我的数据访问函数库的源代码(二)—— SQL语句部分
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- VBA解析VBAProject 05——提取模块代码
- VBA解析VBAProject 06——清除VBA工程密码
- VBA解析VBAProject 07——隐藏模块
- python测试开发django-83.Dockerfile部署django项目
- python测试开发django-82.线上部署设置DEBUG=FALSE
- BCEL ClassLoader去哪了
- python接口自动化35-r.html.render() 下载无反应问题解决
- 源码编译搭建Spark3.x环境
- 搭建Hive3.x并整合MySQL8.x存储元数据
- MySQL binlog_error_action分析
- docker(数据卷容器)
- Python炫技操作:模块重载的五种方法
- 一文搞定 Eureka 集群高可用配置
- SpringBoot三招组合拳,手把手教你打出优雅的后端接口
- 在bootstrap中col-md-offset-* 偏移不起作用