斐波那契数列
来源:互联网 发布:informix sql 定义变量 编辑:程序博客网 时间:2024/06/05 02:12
1. 斐波那契数列
写一个函数,输入n,求斐波那契(fibonacci)数列的第n项,斐波那契数列定义f(0)=0, f(1)=1, f(n)=f(n-1)+f(n-2) (n>1)
1递归解法
<pre name="code" class="cpp">long long fibonacci_recursive(int n){if (n <= 0){return 0;}if (1 == n){return 1;}return fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2);}
2非递归解法
long long fibonacci_Iterative(int n){if (n <= 0){return 0;}if (1 == n){return 1;}long long fibNMinusOne = 1, fibNMinusTwo = 0;long long fibN;for (int i = 2; i <= n; ++i){fibN = fibNMinusOne + fibNMinusTwo;fibNMinusTwo = fibNMinusOne;fibNMinusOne = fibN;}return fibN;}
斐波那契数列属于动态规划问题,因此采用非递归方式(1)节省了递归调用的不必要开销;(2)避免了重复计算。
2. 青蛙跳台阶
2.1 题目
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级台阶共有多少种跳法。
分析:该问题明显属于动态规划问题。设f(n)表示跳n级台阶的跳法种数。
(1) n=0时,无意义。
(2) n=1时,只有1种跳法。
(3) n=2时,共有2种跳法。
(4)n>2时,若第1次跳1级台阶,则剩余n-1级台阶;若第1次选择跳2级台阶,则剩余n-2级台阶。换句话说,n级台阶的跳法可以转化为n-1级与n-2级台阶问题,即f(n) = f(n-1)+f(n-2)。
综上,青蛙跳台阶问题可以表述为公式:f(1)=1, f(2)=2, f(n)=f(n-1)+f(n-2) (n>2)
该公式与斐波那契数列公式相同,但应注意不存在f(0)。
2.2 题目扩展
将2.1中的条件改成:一只青蛙一次可以跳任意大于0级台阶,此时青蛙跳n级台阶总共有多少种跳法?证明f(n)=2n-1。
分析:类似于题目2.1有f(1) = 1,f(2)=2,当n>2时f(n) = f(n-1)+f(n-2)+…+f(1)+1,分别对应青蛙第一次跳1级、2级、…、n级。因此该问题也可以用类似于斐波那契数列的方法实现,但对于非递归实现,因n级台阶的计算需要用到所有小于n级台阶的跳法,因此n个变量用于存储计算值,可申请长度为n的long long指针实现。
递归方法证明f(n)=2n-1:
(1) i=1,2时显然分别有f(1)=1=21-1与f(2)=2=22-1种跳法。
(2) 假设i<n时有f(i)=2i-1,则i=n时,由分析中的递推公式可得f(i)=f(i-1)+f(i-2)+…+f(1)=2i-2+2i-3+…+21-1+1=2i-1(等比公式),即f(n)=2n-1。
综上所述,f(n)=2n-1。
因为有了递推公式因此也可以用迭代法证明f(n)=2n-1。
- 斐波那契数列数列计算
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 斐波那契数列
- 黑马程序员_面向对象二
- MATLAB绘图相关
- URAL 1981. Parallel and Perpendicular 对角线的平行和垂直
- too big changes in h
- 移动与选择工具(高级使用)
- 斐波那契数列
- Socket编程实践(13) --UNIX域协议
- jdbc相关文档
- linux常用命令集合
- 黑马程序员_图形用户界面GUI-基本操作
- 记忆化搜索——POJ 1088
- zend studio 安装时出现could not write value to key
- 1092.To Buy or Not to Buy
- Java设计模式——外观模式(门面模式)(Facade)