斐波那契数列
在数学中,是用递归的方法来定义的:
由0和1开始,之后的斐波那契系数就是由之前的两数相加而得出。
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233……
为了重新认识斐波那契数列,特地去wiki了一下,进行了完整的了解。ps:真的蛮有意思的,顺便再重温初等数学哈哈哈哈哈...
起源:根据高德纳(Donald Ervin Knuth)的《计算机程序设计艺术》(The Art of Computer Programming),1150年印度数学家Gopala和金月在研究箱子包装对象长宽刚好为1和2的可行方法数目时,首先描述这个数列。在西方,最先研究这个数列的人是比萨的列奥那多(意大利人斐波那契Leonardo Fibonacci),他描述兔子生长的数目时用上了这数列:
.第一个月初有一对刚诞生的兔子
.第二个月之后(第三个月初)它们可以生育
.每月每对可生育的兔子会诞生下一对新兔子
.兔子永不死去
假设在n月有兔子总共a对,n+1月总共有b对。在n+2月必定总共有a+b对:因为在n+2月的时候,前一月(n+1月)的b对兔子可以存留至第n+2月(在当月属于新诞生的兔子尚不能生育)。而新生育出的兔子对数等于所有在n月就已存在的a对。
斐波纳契数也是帕斯卡三角形的每一条红色对角线上数字的和。
总结下来就是
Fn = fn-1 + fn-2(n≧2)
下面我们用JS去求一下斐波那契数列吧
FibonacciFunc = (n) => {
//前两项0和1 ->基线条件
if ( n < 1 ) return 0
if ( n <= 2 ) return 1
return FibonacciFunc(n - 1) + FibonacciFunc(n-2)
下面是FibonacciFunc(5)的调用情况:
//下面用Fib...代替FibonacciFunc名称
Fib...(5)
Fib...(4) + Fib...(3)
| |
v v
Fib...(3) + Fib...(2) Fib...(2) + Fib...(1)
Fib...(2) + Fib...(1)
其实,还有另外一种写斐波那契函数的写法,叫记忆法。记忆法就是一种保存前一个结果的值的优化方法,类似缓存一样。上面我们在分析FibonacciFunc(5)的时候可以看出FibonacciFunc(3)调用了两次,所以,可以把它的值给储存起来:
FibonacciMemory = (n) => {
const memo = [0, 1]
const fibonacci = (n) => {
if ( memo[n] ) {
return memo[n]
} else {
return memo[n] = fibonacci(n-1, memo) + fibonacci(n-2, memo)
return fibonacci