记忆化斐波那契函数(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);
}