斐波那契数列 在数学中,是用递归的方法来定义的: 由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