• 递归的几种方式,以及递归的优化

拿斐波那契数列 的三种写法来举例:

# 递归

function fib(n) {
    if( n === 0){
        return 0
    }
    if(n === 1 || n === 2){
        return 1
    }

    return fib(n-1) + fib(n-2)
}

console.log(fib(3))     // 2
console.log(fib(5))     // 5
console.log(fib(10))    // 55

# 迭代

function fib2(n) {
    let arr = [0, 1, 1]
    for (let i = 3; i <= n; i++){
        arr[i] = arr[i-1] + arr[i-2]
    }
    return arr[n]
}
console.log(fib2(3))     // 2
console.log(fib2(5))     // 5
console.log(fib2(10))    // 55

# 尾递归

  • 优化递归,减少栈的消耗,效率与迭代差不多
function fib3(n, pre = 0, next = 1) {
    if(n === 0){
        return pre
    }
    if(n === 1){
        return next
    }
    return fib3(n - 1, next, pre + next)
}
console.log(fib3(2))   // 1
console.log(fib3(3))     // 2
console.log(fib3(5))     // 5
console.log(fib3(10))    // 55

# 递归扩展

function hanoi(n, x, y, z) {
    if(n === 0){
        return
    }
    hanoi(n - 1, x, z, y)
    console.log(`${++num}: 把第${n}个盘子从${x}移动到${z}`)
    hanoi(n - 1, y, x, z)
}

let hanioNum = 4, num = 0;
// hanoi(hanioNum, 'A', 'B', 'C')