剑指offer09:斐波那契数列
来源:互联网 发布:什么变声软件好用 编辑:程序博客网 时间:2024/05/22 03:47
递归和循环
递归实现方法代码简洁,但性能不如循环。
优先采用递归 !
递归的缺点
缺点1:递归由于是函数调用自身,而函数调用是有时间和空间的消耗的
每一次函数调用,都需要在内存栈中分配空间以保存参数、返回地址以及临时变量,而且往栈压入数据和弹出数据都需要时间。
缺点2:递归中有可能很多计算是重复的。
递归的本质是把一个问题分解成两个或者多个小问题。如果小问题存在相互重叠的部分,就存在重复计算。
缺点3:递归可能引发栈溢出。
因为需要每次函数调用在内存栈中分配空间,而每个进程的栈的容量是有限的。当递归调用层数太多时,就会超出栈的容量,导致栈溢出。
递归解法
题目一: 写一个函数,输入n,求斐波那契数列的第n项
递归解法的时间复杂度为n的指数级
public static int fibonacci(int n){ if(n < 2){ return n; } return fibonacci(n-1) + fibonacci(n-2); }
循环解法
时间复杂度为n
public class Solution { public int Fibonacci(int n) { int[] result = {0, 1}; if(n < 2) return result[n]; int fbMinusOne = 1; int fbMinusTwo = 0; int fbN = 0; for(int i = 2; i <= n; ++i){ fbN = fbMinusOne + fbMinusTwo; fbMinusTwo = fbMinusOne; fbMinusOne = fbN; } return fbN; }}
拓展1- 青蛙跳楼梯
题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级台阶总共有多少种跳法。
假如青蛙在第n级楼梯处, 则有0种跳法; 如果在第n-1级有一种跳法,就是一次跳一级; 如果在第n-2级, 则有两种方式, 每次跳一级,分两次跳到第n级, 亦或可以一次跳两级到达第n级。
public class Solution { public int JumpFloor(int target) { int[] result = {0, 1, 2}; if(target <= 2) return result[target]; int minusOne = 2; int minusTwo = 1; int jf = 0; for(int i = 3; i <= target; ++i){ jf = minusOne + minusTwo; minusTwo = minusOne; minusOne = jf; } return jf; }}
拓展2- 青蛙跳楼梯
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
指数阶乘, 2^(n-1) 种跳法
public class Solution { public int JumpFloorII(int target) { if(target <= 0) return 0; return 1 << (target - 1); }}
拓展3- 覆盖矩形
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
public class Solution { public int RectCover(int target) { if(target <= 0) return 0; int[] result = {1, 2}; if(target <= 2) return result[target - 1]; int one = 2; int two = 1; int total = 0; for(int i = 3; i <= target; i++){ total = one + two; two = one; one = total; } return total; }}
参考文献
http://blog.csdn.net/lizhongping00/article/details/67631929
0 0
- 剑指offer09:斐波那契数列
- 【面试题】剑指offer09--菲波那切数列中的变态青蛙问题
- 【面试题】剑指offer09--递归法和非递归法斐波那契数列的第n个数
- 斐波那契数列数列计算
- 【剑指offer】斐波那契数列
- 剑指Offer9斐波那契数列
- 剑指offer--斐波那契数列
- 剑指Offer-斐波那契数列
- 剑指offer:斐波那契数列
- 《剑指offer》斐波那契数列
- 剑指 offer:斐波那契数列
- 【剑指Offer】斐波那契数列
- 剑指offer7 斐波那契数列
- 剑指offer 斐波那契数列
- 【剑指offer】斐波那契数列
- 剑指offer 斐波那契数列
- [剑指offer]斐波那契数列
- 剑指offer06--斐波那契数列
- 加密术
- 零xml配置Hibernate:使用hibernate.properties代替hibernate.cfg.xml
- 查询助手代码
- OpenGL入门
- 文件句柄、文件描述符与进程和多线程
- 剑指offer09:斐波那契数列
- period题解(用KMP算法来(判断字符串重复)
- spring boot中使用spring-data-jpa
- MIPI DSI协议介绍
- 算法设计与应用基础: 第七周(1)
- Xampp + Zend Studio 开启Xdebug调试功能
- 自定义控件三部曲视图篇(三)——瀑布流容器WaterFallLayout实现
- 点击a标签先判断后跳转
- 【CF398E】Sorting Permutations(sort)