斐波那契数列和青蛙跳问题
来源:互联网 发布:淘宝200多的智能机 编辑:程序博客网 时间:2024/05/21 10:02
递归的显著缺点
递归由于调用自身,而函数调用是有时间和空间的消耗的:每一次函数调用,都需要在内存栈中分配内存空间以保存参数、返回地址及临时变量,而且往栈里压入数据和弹出数据都需要时间。
另外,递归中有可能很多计算都是重复的,从而对性能带来很大的负面影响。递归的本质是把一个问题分解成两个或者多个小问题。如果多个小问题存在互相重叠的部分,那么久存在重复的计算。
斐波那契数列
效率最低的解法
//递归调用 long fibonacci(int n){ if(n<=0){ return 0; } if (n==1){ return 1; } return fibonacci(n-1)+fibonacci(n-2); }
树中有多个结点是重复的,而且重复的结点数会随着n的增加而急剧增加,这意味着随着n增加。用递归方法计算的时间复杂度是以n的指数的方式递增的
改进的方式,只要避免重复计算,将得到的数列中间值保存起来,下次要计算查找一下
更简单的方式是从下往上走,计算f(0)和f(1)的f(2)以此计算
public static int fibonaci(int n) { int result[ 2]={ 0, 1 } ; if (n < 2) return result[n]; long fibNMinusOne=1; long fibNMinuesTwo=2; long fibN=0; for(int i =2;i<=n;i++){ fibN = fibNMinusOne+fibNMinuesTwo; fibNMinuesTwo = fibNMinusOne; fibNMinusOne =fibN; } return fibN; }
青蛙跳题目(扩展)
一只青蛙一次可以跳上一个台阶,也可以跳上2个台阶,求青蛙跳上一个n级台阶共有多少总跳法
思路:如果只有1级台阶,显然只有一种跳法,如果两个台阶,就来有种跳法
一般情况下,我们把n级台阶时的跳法看成是n的函数,记为f(n)。当n>2时,第一次跳的时候就有两种不同的选择:一是第一次只跳1级,此时跳法数目等于后面剩下的n-1级台阶的跳法数目,即为f(n-1);另一种选择是第一次跳2级,此时跳法数目等于后面剩下的n-2级台阶的跳法数目即为f(n-2)因此n级台阶的不同跳法总数是f(n)=f(n-1)+f(n-2)
青蛙跳扩展2
如果一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。。。它也可以跳上n级台阶,此时青蛙跳上一个n级台阶共有集中跳法,用数学的归纳法可以证明是f(n)=2^{(n-1)}
格子覆盖问题(扩展)
我们可以用2x1 的小矩形横着或者竖着去覆盖更大的矩形如8个2x1 的小矩形无重叠的覆盖一个2x8的大矩形,共有几种方法
思路:我们先把2x8的覆盖方法记为f(8)用第一个1x2小矩形去覆盖大矩形的最左边两个选择,竖着或者横着放,当竖着放,右边还剩下2x7的区域,它的覆盖方法即为f(7)。然后考虑横着放的情况。当1x2的小矩形横着放在左上角的时候,左下角必须和横着放一个1x2的小矩形,而在右边还剩下2x6的区域,这种情形下的覆盖方法记为f(6),因此f(8)=f(7)+f(6)也是个斐波那契数列
- 斐波那契数列和青蛙跳问题
- 青蛙跳和斐波那契数列(转)
- 青蛙跳台阶问题&&斐波那契数列问题
- 斐波那契数列及青蛙跳台阶问题
- 斐波那契数列及青蛙跳台阶问题
- 斐波那契数列及青蛙跳台阶问题
- 斐波那契数列和青蛙跳台阶的问题
- 斐波那契数列的优化问题 青蛙跳台阶问题
- 青蛙跳台阶问题,常见面试算法题,斐波那契数列(Fibonacci Sequence)
- 剑指offer面试题9 斐波那契数列及青蛙跳台阶问题
- 青蛙跳台阶(斐波那契数列应用)
- 斐波那契数列(青蛙跳台阶)
- C++实现斐波那契数列/青蛙跳台阶
- 2、斐波那契数列以及青蛙跳台阶
- 青蛙跳台阶----斐波那契数列
- 斐波那契数列衍生:求青蛙跳台阶
- 斐波那契数列变形之青蛙跳台阶
- 青蛙跳台阶转换斐波那契数列
- 百词斩
- dpdk多进程示例解读(examples/multi_process/simple_mp)
- 虚拟机中的ubuntu怎么设置1920X1080分辨率
- Python包管理:pip、easy_install、eggs和wheel
- Linux内核中的fastcall和asmlinkage宏
- 斐波那契数列和青蛙跳问题
- 【放苹果(题解)】
- JAVA中关于List集合和map集合之间的继承关系
- C#语法小知识(十八)const与readonly
- 文件描述符fd和文件指针fp之间的相互转换
- 输出数组中所有三个数相加为0的解
- HTML 3 元素和属性
- 从一个字符数组中读出相应的整数、实数
- Linux编程之线程介绍