前端面试题

记忆化斐波那契函数(Memoization)

2019-03-27  本文已影响0人  千茉紫依

斐波那契数列指的是类似于以下的数列:
1, 1, 2, 3, 5, 8, 13, ....
也就是,第 n 个数由数列的前两个相加而来:f(n) = f(n - 1) + f(n -2)
请你完成 fibonacci 函数,接受 n 作为参数,可以获取数列中第 n 个数,例如:
fibonacci(1) // => 1
fibonacci(2) // => 1
fibonacci(3) // => 2
...
测试程序会从按顺序依次获取斐波那契数列中的数,请注意程序不要超时,也不要添加额外的全局变量。
题目链接

我一下午写了四个方案,都没通过,前两个使用的递归,超时很严重,感觉是并发量大的原因,于是第三个加入了缓存,这次没有了超时的问题,但是栈溢出,第四个使用了尾递归,依旧是栈溢出,无语,崩溃中。。。。留坑,有空再撸吧

我的答案一: 未通过( Your code wasted too much time )
const fibonacci = (n) =>{
          const C = n => {
                if (n <= 2) {
                    return 1;
                } else {
                    return C(n - 1) + C(n - 2);
                }
            };
            let result = [];
            let m = n;
            while (m > 0) {
                result.unshift(C(m));
                m--;
            }
            return result[n - 1];
}
我的答案二: 未通过( Your code wasted too much time )
const fibonacci = (n) =>{
          const C = n => {
                if (n <= 2) {
                    return 1;
                } else {
                    return C(n - 1) + C(n - 2);
                }
            };
            return C(n)
}
我的答案三: 未通过( Maximum call stack size exceeded )
const fibonacci = (n) =>{
           const C = n => {
                let P = this;
                P[1] = 1;
                P[2] = 1;
                if (!P[n]) {
                    P[n] = C(n - 1) + C(n - 2);
                }
                return P[n];
            };
            C(n);
}
我的答案四: 未通过( Maximum call stack size exceeded )
const fibonacci = (n) =>{
      const C = (n, ppre, pre) => {
                let P = this;
                P[1] = 1;
                P[2] = 1;
                if (!P[n]) {
                    C(n - 1, pre, ppre + pre);
                    P[n] = ppre + pre;
                }
                if (n > 3) {
                    return P[3];
                } else {
                    return 1;
                }
            };
            C(n, 1, 1);
}
上一篇 下一篇

猜你喜欢

热点阅读