0 1 1 2 3 5 …
递归
function fibonacci ( num ){
if ( num === 0 ) return 0
if ( num === 1 ) return 1
return fibonacci ( num-1 ) + fibonacci ( num-2 )
}
会重复执行部分计算
如 fibonacci(10) =fibonacci(9) + fibonacci(8) , fibonacci(9) = fibonacci(8) + fibonacci(7),fibonacci(8)被重复执行 ,代码复杂
时间复杂度 O(2^n)
空间复杂度 O(n)
递归优化(尾递归)
尾递归:如果一个函数中所有递归形式的调用都出现在函数的末尾,我们称这个递归函数是尾递归的。
数列 0 1 2 3 5 8 … 台阶 等
function fibonacci (n) {
if (n <= 0) return 0;
function fn(n, a, b) {
if (n == 1) return a
else return fn(n - 1, b, a + b)
}
return fn(n, 1, 2)
}
时间复杂度 O(n)
函数调用 n-1次
空间复杂度 O(n)
占用n-1个内存空间
for循环
数列 1 3 4 7 11 18 …
function fibonacci( num ) {
if ( num <= 0 ) return 0;
if ( num === 1 ) return 1;
if ( num === 2 ) return 3;
let a = 1 ;
let b = 3 ;
let result = a + b;
for ( let f = 3; f < num; f++){
a = b;
b = result;
result = a + b;
}
return result
}
1.时间复杂度 O(n)
程序循环了n-3次
2.空间复杂度 O(1)
该程序中创建了3个变量
变态青蛙
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
n=0 0 f(0)
n=1 有 1 种 f(1) =1
n=2 有 2 种 f(2) = f(1) + f(0)
n=3 有 4 种 f(3) = f(2) + f(1) + f(0)
n=4 有 8 种 f(4) = f(3) + f(2) + f(1) + f(0) 又:
(f(3) = f(2) + f(1) + f(0)) 所以:
f(4) = f(3) + f(3)
function btqw(n) {
if (n == 0) return 0
let result = 1
for (let a = 1; a < n; a++) {
result *=2;
}
return result
}