前端涨薪功法:一文掌握你所需的递归知识 | 您所在的位置:网站首页 › 数列的子序列 › 前端涨薪功法:一文掌握你所需的递归知识 |
故事中的递归技巧
一只狗来到厨房,偷走一小块面包。厨子举起杓子,把那只狗打死了。于是所有的狗都跑来了,给那只狗掘了一个坟墓,还在墓碑上刻了墓志铭,让未来的狗可以看到:“一只狗来到厨房,偷走一小块面包。厨子举起杓子,把那只狗打死了。于是所有的狗都跑来了,给那只狗掘了一个坟墓,还在墓碑上刻了墓志铭,让未来的狗可以看到:‘一只狗来到厨房,偷走一小块面包。厨子举起杓子,把那只狗打死了。于是所有的狗都跑来了,给那只狗掘了一个坟墓,还在墓碑上刻了墓志铭,让未来的狗可以看到……’” 这个故事可以一直讲下去,也就是一则无限递归的小故事了,故事本身一直在重复 JavaScript中的递归:直接与间接递归递归是一种编程技巧,函数调用自身来解决问题。 其本质是在计算机科学中来说,递归是一种解决计算问题的方法,其中的解决方案取决于同一问题的较小实例的解决方案 较小的实例的解决方案,也就是解决问题的最简实例。 在JavaScript中,递归可以用来解决各种问题,如遍历和搜索树或图,生成排列或组合,以及解决数学问题。 递归主要有两种类型:直接递归和间接递归。 在直接递归中,函数直接调用自身。在间接递归中,函数调用另一个函数,后者又调用原始函数,形成一个循环。 以下是JavaScript中阶乘的直接递归的示例 阶乘的数学定义 最简示例 2 * 1 结束条件 n === 1 function factorial(n) { if (n === 1) { return 1; } else { return n * factorial(n - 1); } } console.log(factorial(5)); // 输出:120如下图所示向下传递数据就是一直到终止条件factorial(1),向上递归数据第一步就是变为最简的解决方案即 1 * 2 以下是JavaScript中间接递归的示例: function isEven(n) { if (n === 0) { return true; } else { return isOdd(n - 1); } } function isOdd(n) { if (n === 0) { return false; } else { return isEven(n - 1); } } console.log(isEven(4)); // 输出:true console.log(isOdd(4)); // 输出:false在这个例子中,isEven和isOdd函数间接地调用彼此来判断给定数字是偶数还是奇数。isEven函数检查输入数字n是否等于0,如果是,则返回true。否则,它调用isOdd函数并传入n - 1。类似地,isOdd函数检查n是否等于0,如果是,则返回false。否则,它调用isEven函数并传入n - 1。 从上可以得出,写好一个递归方法,也就是关注两点 基本解决方案实例递归结束条件 优化递归的方案网上传的尾递归,拿上面的阶乘递归来说,尾递归版本是: function factorial(n, acc = 1) { if (n }) { if (n in memo) { return memo[n]; } if (n === 0) { return 1; } memo[n] = n * factorial(n - 1); return memo[n]; }碰上大数据量的数据时,可以通过递归推出for循环版本的算法: function factorial(n) { let result = 1; for (let i = 1; i |
CopyRight 2018-2019 实验室设备网 版权所有 |