斐波那契数列的算法研究
2014-04-02 23:23
253 查看
背景:
假定你有一雄一雌一对刚出生的兔子,它们在长到一个月大小时开始交配,在第二月结束时,雌兔子产下另一对兔子,过了一个月后它们也开始繁殖,如此这般持续下去。每只雌兔在开始繁殖时每月都产下一对兔子,假定没有兔子死亡,在一年后总共会有多少对兔子?
在一月底,最初的一对兔子交配,但是还只有1对兔子;在二月底,雌兔产下一对兔子,共有2对兔子;在三月底,最老的雌兔产下第二对兔子,共有3对兔子;在四月底,最老的雌兔产下第三对兔子,两个月前生的雌兔产下一对兔子,共有5对兔子;……如此这般计算下去,兔子对数分别是:1, 1, 2, 3, 5, 8, 13, 21, 34, 55,89, 144, ...看出规律了吗?从第3个数目开始,每个数目都是前面两个数目之和。这就是著名的斐波那契(Fibonacci)数列。
有趣问题:
1,有一段楼梯有10级台阶,规定每一步只能跨一级或两级,要登上第10级台阶有几种不同的走法?
答:这就是一个斐波那契数列:登上第一级台阶有一种登法;登上两级台阶,有两种登法;登上三级台阶,有三种登法;登上四级台阶,有五种方法……所以,1,2,3,5,8,13……登上十级,有89种。
2,数列中相邻两项的前项比后项的极限是多少,就是问,当n趋于无穷大时,F(n)/F(n+1)的极限是多少?
答:这个可由它的通项公式直接得到,极限是(-1+√5)/2,这个就是所谓的黄金分割点,也是代表大自然的和谐的一个数字。
数学表示:
Fibonacci数列的数学表达式就是:
F(n) = F(n-1) + F(n-2)
F(1) = 1
F(2) = 1
递归程序1:
Fibonacci数列可以用很直观的二叉递归程序来写,用C++语言的描述如下:
迭代解法:
Fibonacci数列用迭代程序来写也很容易,用C++语言的描述如下:
这时程序的效率显然为O(N),N
= 45的时候<1s就能得到结果。
假定你有一雄一雌一对刚出生的兔子,它们在长到一个月大小时开始交配,在第二月结束时,雌兔子产下另一对兔子,过了一个月后它们也开始繁殖,如此这般持续下去。每只雌兔在开始繁殖时每月都产下一对兔子,假定没有兔子死亡,在一年后总共会有多少对兔子?
在一月底,最初的一对兔子交配,但是还只有1对兔子;在二月底,雌兔产下一对兔子,共有2对兔子;在三月底,最老的雌兔产下第二对兔子,共有3对兔子;在四月底,最老的雌兔产下第三对兔子,两个月前生的雌兔产下一对兔子,共有5对兔子;……如此这般计算下去,兔子对数分别是:1, 1, 2, 3, 5, 8, 13, 21, 34, 55,89, 144, ...看出规律了吗?从第3个数目开始,每个数目都是前面两个数目之和。这就是著名的斐波那契(Fibonacci)数列。
有趣问题:
1,有一段楼梯有10级台阶,规定每一步只能跨一级或两级,要登上第10级台阶有几种不同的走法?
答:这就是一个斐波那契数列:登上第一级台阶有一种登法;登上两级台阶,有两种登法;登上三级台阶,有三种登法;登上四级台阶,有五种方法……所以,1,2,3,5,8,13……登上十级,有89种。
2,数列中相邻两项的前项比后项的极限是多少,就是问,当n趋于无穷大时,F(n)/F(n+1)的极限是多少?
答:这个可由它的通项公式直接得到,极限是(-1+√5)/2,这个就是所谓的黄金分割点,也是代表大自然的和谐的一个数字。
数学表示:
Fibonacci数列的数学表达式就是:
F(n) = F(n-1) + F(n-2)
F(1) = 1
F(2) = 1
递归程序1:
Fibonacci数列可以用很直观的二叉递归程序来写,用C++语言的描述如下:
long fib1(int n) { if (n <= 2) { return 1; } else { return fib1(n-1) + fib1(n-2); } }递归效率较低。
迭代解法:
Fibonacci数列用迭代程序来写也很容易,用C++语言的描述如下:
//也可以用数组将每次计算的f(n)存储下来,用来下次计算用(空间换时间) long fib3 (int n) { long x = 0, y = 1; for (int j = 1; j < n; j++) { y = x + y; x = y - x; } return y; }
这时程序的效率显然为O(N),N
= 45的时候<1s就能得到结果。
相关文章推荐
- 经典算法研究-斐波那契(fibonacci)数列
- 斐波那契数列:一道100年后羊圈羊的数量算法题
- 斐波那契数列的最优算法(O(logN))
- [kotlin·算法]二元选择排序对有序数列排序失败的研究
- 斐波那契数列算法分析
- 斐波那契数列算法分析[转载]
- Java(4):基础算法(1)--斐波那契数列之小兔子生孩子
- 斐波那契数列算法——递归与非递归
- 算法之递归算法(斐波那契数列之美)(100级阶梯,1,2步,几种方法)
- 斐波那契数列的三种算法以及复杂度
- 斐波那契数列的应用(算法实现)
- 斐波那契数列公式算法-JS实现
- 斐波那契数列两种算法
- 斐波那契数列和二分查找的算法(递归与非递归)
- python实现经典算法(2):Fibonacci(斐波那契)数列
- 斐波那契数列的三种算法
- 斐波那契数列的各种算法实现
- 斐波那契数列算法小结
- 台阶问题:斐波那契数列的扩展问题研究
- 斐波那契数列的多种算法,迭代法+递归法+动态规划+矩阵幂