持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情
递归在我们书写一些特殊业务场景的时候会使用到,比如在有些后台管理项目中的侧边栏和不知道层级的数据都需要使用到递归,同时在面试的过程中也是一个绕不过去的点,很多人都对递归函数懵懵懂懂的,今天我们就讲解一下吧
递归
什么叫做递归,网上给出的回答是函数自己调用自己,同时需要设置一个停止调用自己的条件,这么说挺通俗易懂的,但是你真正理解了吗,学好递归需要知道递归边界条件和递归体是什么
- 递归边界条件:设置一个函数停止调用自己的条件,防止无休止的一直调用
- 递归体:将拥有一个很多相同功能的大模块分解成一个小功能的模块,俗称递归模式
为什么要设置递归边界条件呢,是因为递归函数会发生“栈溢出”的情况,我们必须通过if语句结合return关键字,形成一个递归边界条件,达到这个边界条件之后就停止递归,就能很好的防止栈溢出
递归注意点
- 递归函数一定要设置边界条件,否则会出现“栈溢出”的情况
- 递归函数对比非递归函数运行所消耗性能,递归函数运行无论是从消耗时间还是占用内存上来说都比非递归函数要高
递归函数
这里是使用一个递归函数写出了一个阶乘的操作,这样让我们便于理解
function Factorial(n) {
// 递归出口:防止死循环,因为1的阶乘还是1
if (n === 1) return 1;
//调用自己,形成递归
return n * Factorial(n - 1);
}
console.log('函数阶乘', Factorial(4));
递归实现查找喇叭花数
喇叭花数:是指一个三位数的每个数的阶乘总和等于本身,也就是说百位,十位,个位,每个数的阶乘总和等于三位数的本身就是喇叭花数
需求:查找出100-999之间的喇叭花数
实现思路
我们通过编写一个递归,用于处理计算每个数据的阶乘,然后再通过循环,从100开始到999结束,因为需求是查找100-999之间的喇叭花数,然后再把每个数字转换成字符串进行分离,分离之后在每个分离的字符转换成数字进行调用递归,进行数字阶乘,然后再获取到使用递归阶乘过后的数,进行判断是否等于自身,等于自身则是喇叭花数
/* 例如4:1 * 2 * 3 * 4这就是阶乘函数 */
/**
* @function: 阶乘函数
* @param {Number} n 当前传递要阶乘的数字
* @return {Number} rults 阶乘总和的数字
*/
function fction(n) {
let rults = 1;
for (let i = 1; i <= n; i++) {
rults *= i;
}
return rults;
}
// 100 -999之间的喇叭花数
for (let j = 100; j < 999; j++) {
// 转换成字符串
let str = j.toString(),
sum = 0;
// 当前的字符串改成数字
let str_0 = Number(str[0]);
let str_1 = Number(str[1]);
let str_2 = Number(str[2]);
//进行阶乘处理并判断
sum = fction(str_0) + fction(str_1) + fction(str_2);
//判断阶乘函数是否等于自身
if (sum === j) {
console.log('喇叭花数', str_0, str_1, str_2, '阶乘', fction(str_0), fction(str_1), fction(str_2));
console.log('阶乘数', 1 * 2 * 3 * 4);
// 进行打印当前喇叭花数
console.log('当前的喇叭花数是', sum);
};
};