小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
const fib = (n) => {
if(n <= 2) return 1;
return fib(n-1) + fib(n-2)
};
用文字来说,就是斐波那契数列由0和1开始,之后的斐波那契数就是由之前的两数相加而得出。我们图解形式将计算斐波那契数列中某一个数计算过程
通过一个递归来实现,首先这里给出一个 base case 用于判断退出递归 if(n <= 2) return 1; 我们在设计递归函数需要考虑 3 件事,分别是退出或者叫做边界条件(base case),然后函数的参数和返回值都什么,以及每次层次逻辑是什么。
我们都知道斐波那契数列计算的时间复杂度为 而其空间复杂度为 ,下面
上边图给出时间复杂度为,可能有些人会产生这样疑问,为什么介绍这个线性的复杂度呢,其实我们看到复杂时间度都是基于简单时间复杂度。
这里时间复杂度是 但是因为常数时间复杂度可忽略不计所以这里时间复杂度也是
上边我们分析了了进行两次时间复杂度 和 从而可以计算出 时间复杂度为他们之间所以是
const fib = (n) => {
if(n <= 2) return 1;
return fib(n-1) + fib(n-2)
};
const res = fib(6);
console.log(res);
const lineFunc = (n) => {
if (n <= 1) return;
lineFunc(n - 1);
}
const lineFunc2 = (n) => {
if (n <= 1) return;
lineFunc2(n-2);
}
const dib = (n) =>{
if(n <=1 ) return;
dib(n - 1);
dib(n - 1);
}
const lib = (n) =>{
if(n <=1 ) return;
lib(n - 2);
lib(n - 2);
}
我么设置缓存来解决递归的时间复杂度问题将时间复杂度从 变为
const fib = (n,memo = {}) => {
if (n in memo) return memo[n]
if (n <=2 ) return 1;
memo[n] = fib(n-1,memo) + fib(n-2,memo);
return memo[n];
}
console.log(fib(50))