程序员面试系列程序员
Java面试系列-webapp文件夹和WebContent文件夹的区别?web
程序员面试系列:Spring MVC能响应HTTP请求的缘由?面试
Java程序员面试系列-什么是Java Marker Interface(标记接口)数据库
使用JDK自带的工具jstack找出形成运行程序死锁的缘由编程
JavaScript面试系列:JavaScript设计模式之桥接模式和懒加载设计模式
面试题:用JavaScript开发一个函数,打印非波拉契数列。闭包
咱们只要记住非波拉契数列的计算公式,就不难写出来了:app
F(0)=1,F(1)=1, F(n)=F(n-1)+F(n-2)webapp
我写的JavaScript代码以下:
var fib = function (a, b) { var _current = a + b; return { current: _current, next: function () { return fib(b, _current); } } }
把当前这一轮的计算结果存储到第二行的变量_current里,并经过属性current返回给调用者。返回的json对象除了current属性外,还有另外一个属性next,指向一个闭包函数调用。一旦next指向的函数再次被调用,则会再次触发数列的计算。
var generator = fib(1,1); // 前一行调用fib(1,1)计算1+1的结果为2,将2存储到_current里经过current属性返回,因此打印2 // 同时返回next函数,函数体为return fib(b, _current); 此时b为1,_current为2 console.log(generator.current); // 一旦执行next函数,则执行其指向的return fib(b, _current); 1 + 2 = 3 var result = generator.next(); console.log(result.current); // 打印3
若是要打印10个非波拉契数列的值,意味着我要重复调用9次fib函数,太麻烦。因而我写了个函数把fib调用包裹起来。
这个包裹函数有两个输入参数,n为但愿生成非波拉契数列元素的个数,第二个参数sequence接受一个函数。