【剑指Offer面试题】 九度OJ1387:斐波那契数列
2015-07-27 22:33
686 查看
题目链接地址:
http://ac.jobdu.com/problem.php?pid=1387
题目描述:
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。斐波那契数列的定义如下:
输入:
输入可能包含多个测试样例,对于每个测试案例,
输入包括一个整数n(1<=n<=70)。
输出:
对应每个测试案例,
输出第n项斐波那契数列的值。
样例输入:
3
样例输出:
2
根据斐波那契数列公式,我们很快就能想到递归的解法并写出以下代码:
上述递归解法有很严重的效率问题。我测试过n为100时,很久也没有出来结果。同时360加速球迅速暴涨,吃内存了。
为什么递归的效率低?
因为递归运算中存在着很多“重复计算”同一个函数,计算量会随着n的增大而迅速增大。
同时递归就是函数反复调用自身,需要不断地申请和释放栈空间(保存参数,返回地址等),从而增加了时间和空间开销。而且每个进程的栈空间是有限的,当递归调用的层次太多,就会超过栈的容量,最后导致调用栈溢出。
只能采用循环法来解决问题。
从下往上计算
根据斐波那契数列的第0项和第1项相加得到斐波那契数列的第2项,通过第1项与第2项相加得到第3项,… … 依次类推,我们就可以通过第n – 2项与第n – 1项相加得到第n项的斐波那契数列。这样的时间复杂度是O(n)。
避免了递归算法中的“重复计算”,而且又不需要额外申请和释放栈空间。
时间复杂度为O(n)。
空间复杂度O(1)。
http://ac.jobdu.com/problem.php?pid=1387
题目1387:斐波那契数列
时间限制:1 秒内存限制:32 兆特殊判题:否提交:6515解决:1952题目描述:
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。斐波那契数列的定义如下:
输入:
输入可能包含多个测试样例,对于每个测试案例,
输入包括一个整数n(1<=n<=70)。
输出:
对应每个测试案例,
输出第n项斐波那契数列的值。
样例输入:
3
样例输出:
2
思路分析:
效率很低的递归解法:根据斐波那契数列公式,我们很快就能想到递归的解法并写出以下代码:
long long Fibonacci(int n) { if(0 == n) return 0; else if(1 == n) return 1; else return Fibonacci(n - 1) +Fibonacci(n - 2); }
上述递归解法有很严重的效率问题。我测试过n为100时,很久也没有出来结果。同时360加速球迅速暴涨,吃内存了。
为什么递归的效率低?
因为递归运算中存在着很多“重复计算”同一个函数,计算量会随着n的增大而迅速增大。
同时递归就是函数反复调用自身,需要不断地申请和释放栈空间(保存参数,返回地址等),从而增加了时间和空间开销。而且每个进程的栈空间是有限的,当递归调用的层次太多,就会超过栈的容量,最后导致调用栈溢出。
只能采用循环法来解决问题。
从下往上计算
根据斐波那契数列的第0项和第1项相加得到斐波那契数列的第2项,通过第1项与第2项相加得到第3项,… … 依次类推,我们就可以通过第n – 2项与第n – 1项相加得到第n项的斐波那契数列。这样的时间复杂度是O(n)。
避免了递归算法中的“重复计算”,而且又不需要额外申请和释放栈空间。
时间复杂度为O(n)。
空间复杂度O(1)。
代码:
#include #include #include using namespace std; #define N 75 long long fi ; long long Fibonacci(int n) { int i; fi[0] = 0; fi[1] = 1; for(i = 2;i <= n;i++) { fi[i] = fi[i - 1] + fi[i - 2]; } return fi ; } int main() { int n; while(scanf("%d",&n)!=EOF) { printf("%lld\n",Fibonacci(n)); // long long 输出为 lld } return 0; } /************************************************************** Problem: 1387 Language: C++ Result: Accepted Time:0 ms Memory:1520 kb ****************************************************************/" data-snippet-id="ext.0e4c3f58dbfedab9dd1f6032d37e4a45" data-snippet-saved="false" data-csrftoken="HB0Pd41s-r9R-RhMP7lfBZjJxwhXvvHiA4g0" data-codota-status="done">[code]/********************************* ----------------------------------- 【剑指Offer面试题】 九度OJ1387:斐波那契数列 ----------------------------------- Author:牧之丶 Date:2015年 Email:bzhou84@163.com **********************************/ #include<stdio.h> #include<string> #include<stack> #include <iostream> using namespace std; #define N 75 long long fi ; long long Fibonacci(int n) { int i; fi[0] = 0; fi[1] = 1; for(i = 2;i <= n;i++) { fi[i] = fi[i - 1] + fi[i - 2]; } return fi ; } int main() { int n; while(scanf("%d",&n)!=EOF) { printf("%lld\n",Fibonacci(n)); // long long 输出为 lld } return 0; } /************************************************************** Problem: 1387 Language: C++ Result: Accepted Time:0 ms Memory:1520 kb ****************************************************************/
注意点:
1. 用递归会超时,递归解法有很多重复计算。 2. 结果要用long long保存,不然会发生结果的溢出 3. long long 输出为 %lld。VC++6.0下编译的,long long用_int64代替, %lld用%I64d代替。
相关文章推荐
- 黑马程序员--JAVA<四题经典编程题>--
- 面试题的一些总结
- 面试:实现内存复制函数
- 面试题 —— 替换空格(ReplaceBlank)
- 黑马程序员----JAVA基础----泛型及工具类
- 程序员历练之路
- 程序员必读的六本书
- 程序员须知的基础算法整理
- 黑马程序员-ios学习笔记 oc 继承
- iOS 经典面试题
- 如何准备机器学习工程师的面试 ?
- 阿里一面的面试经历
- 面试题24_二叉搜索树的后序遍历序列
- [置顶] 程序员练级指南
- 海量数据处理面试题
- 剑指offer-面试题23.从上往下打印二叉树
- 面试题23_从上往下打印二叉树
- 程序员笔试面试算法题系列--数组
- 数据科学家可能成为2015年最热门职业
- 面试题 ——— 二维数组的查找