javascript 斐波那契

JavaScript082

javascript 斐波那契,第1张

斐波那契数列,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)

运行结果如下:

i=0j=1k=0Fibonacci(0)=0

i=1j=0k=1Fibonacci(1)=1

i=2j=1k=1Fibonacci(2)=1

i=3j=1k=2Fibonacci(3)=2

i=4j=2k=3Fibonacci(4)=3

......

i数列的序号,这个程序会打印的数列长度为50

j存放的是F(n-2)的结果

k 存放的是F(n-1)的结果

每次循环时,先获取 F(n) = j+k ,然后将F(n-1)付给 j (j=k) 对应的下次循环的F(n-2) ,

将F(n)付给 k (k=fib) 对应的下次循环的F(n-1) 。

当第一次进入时,F(n) = j+ k = 0 + 0 = 0

当第二次进入时,F(n) = j + k = 1 + 0 =1然后 j=1 ,k = 1

当第三次进入时,F(n) = j + k = 1 + 1 = 2然后 j=1 ,k = 2

当第四次进入时,F(n) = j + k = 1 + 2 = 3然后 j=2 ,k = 3

当第五次进入时,F(n) = j + k = 2 + 3 = 5然后 j=3 ,k = 5

......

var memoize = function (f) {

    var cache = {}

    return function () {

        //JSON是JS提供的一个工具对象 (Utility)

        var arg_str = JSON.stringify(arguments)

        cache[arg_str] = cache[arg_str] || f.apply(f, arguments)

        return cache[arg_str]

    }

}

function fibo(n) {

    if (n == 1 || n == 2) {

        return 1

    }

    return fibo(n - 1) + fibo(n - 2)

}

function testfibo(f, n) {

    var now = Date.now()

    f.call(null, n)

    var newNow = Date.now()

    return '执行时间:' + newNow - now + 'ms'

}

var execFibo = memoize(testfibo)

var result = execFibo(fibo, 40)

console.log(result) // -> 863ms

这是异步的,要明白nextTick的作用相当于setTimeout(func, 0), 也就是让代码延后一个执行绪,这样子,fibonacci的计算对当前执行绪就不会有任何阻塞了。。。异步的作用就是要解决阻塞的问题

nodejs程序中一般来说总是只有一个线程,要达到非阻塞(异步)的效果,一般就是这样做

举个例子吧:

假设调用方写了这样的代码:

console.log(1)

fibonacciAsync(3, function(result) {

console.log (result)//

})

console.log(2)

console.log(3)

fibonacciAsync在被调用后立马就会返回,紧接着console.log(2)执行,console.log(3)执行, 然后才是fibonacciAsync的回调函数被调用

因此程序的结果输出为:

1

2

3

6