递归

复制代码
// let i = 0,
//     result = 0;
// function count(i) {
//     if (i==10) {
//         return false;
//     }else {
//         result += i;
//         i++;
//         console.log(result,i);
//         count(i);
//     }
// }    
// count(i);

// 递归累加
// function count(n) {
//     if(n===1 || n===0){
//         return 1;
//     }
//     return n + count(n-1);
// }
// console.log(count(10));

// 递归阶乘
function multiplication(n) {
    if (n===1 || n===0) {
        return 1;
    }
    return n * multiplication(n-1)
}
console.log(multiplication(4));


/* 
JavaScript 调用栈大小的限制
    递归并不会无限地执行下
    去,浏览器会抛出错误,也就是所谓的栈溢出错误(stack overflow error)
*/
// 递归求斐波那契数
// function fibonacci(n) {
//     if(n < 1) return 0;
//     if(n <= 2) return 1;
//     return fibonacci(n-1) + fibonacci(n-2)
// }
// console.log(fibonacci(6));

// 记忆化斐波那契数--它可以防止递归算法重复计算一个相同的值
function fibonacciMemosization(n) {
    const memo = [0, 1];
    function fibonacci(n) {
        console.log('n',n);
        if (memo[n] != null) return memo[n];
        return memo[n] = fibonacci(n-1, memo) + fibonacci(n-2, memo);
    }
    // const fibonacci = (n) => {
    //     console.log('memo',memo);
    //     if (memo[n] != null) return memo[n];
    //     return memo[n] = fibonacci(n-1, memo) + fibonacci(n-2, memo);
    // };
    // console.log(fibonacci);
    return fibonacci(n);
}
let test = fibonacciMemosization(6)
console.log(test);


/* 
为什么要用递归?它更快吗
        迭代的版本比递归的版本快很多,所以这表示递归更慢。但是,再看看三个不同版本的代码。
        递归版本更容易理解,需要的代码通常也更少。另外,对一些算法来说,迭代的解法可能不可用,
        而且有了尾调用优化,递归的多余消耗甚至可能被消除。
        所以,我们经常使用递归,因为用它来解决问题会更简单
*/
复制代码

 

posted @   小白咚  阅读(35)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示