/**
* 求1+2+3+...+n之和
*/
/**
* 迭代
* "自下而上"地解决问题
* 时间效率:效率高,无函数调用开销
* 内存使用:使用固定大小的内存空间
*/
// for循环-预先知道次数的迭代
function forLoop(n){
let res = 0
for(let i=1;i<=n;i++){
res += i
}
return res
}
console.log('for',forLoop(5))
// while循环-迭代,与for循环不同,每轮会先检查条件,为真执行,否则结束循环
function whileLoop(n){
let res = 0
let i = 1
while(i<=n){
res += i
i++
}
return res
}
console.log('while',whileLoop(5))
/**
* 递归
* “自上而下”地解决问题
* 比迭代更加耗费内存-函数执行的上下文数据都在内存中存储,直到函数返回才会释放
* 比循环的时间效率更低
* 实际应用中,递归的深度是有限的,过深的递归会导致栈溢出
*/
function recur(n){
if(n === 1) return 1
const res = recur(n-1)
return n + res
}
console.log('recur',recur(5))
/**
* 尾递归
* 函数返回前的最后一个操作,意味着如果函数返回上一层后,无需继续执行其他操作,即无需保存上一层函数的上下文
* 空间效率上与迭代相当
*/
function tailRecur(n,res){
if(n === 0) return res
return tailRecur(n-1,res + n)
}
console.log('tailRecur',tailRecur(5,0))
/**
* 斐波那契数列
* f(1)=0,f(2)=1,f(n)=f(n-1)+f(n-2)
*/
function fib(n){
if(n === 1) return 0
if(n === 2) return 1
return fib(n-1) + fib(n-2)
}
console.log('fib',fib(5))
console