1.使用尾递归实现阶乘
思路: 阶乘让我想到数组的reduce方法,所以我的思路是设置两个形参,分别代表累计值和乘数,递归每层让乘积乘以乘数,最后一层返回结果
const fn = (n, a = 1) => {
// 当n为1时,计算完毕,返回结果
if(n === 1) return a
// 当n不为1时,计算并递归
return fn(n-1, a * n)
}
console.log(fn(5))
2.使用尾递归查询斐波那契数列的第n项
思路:要求第n项,必须从第一层开始增加,已知要求第n项,所以需要设置形参n来控制层数,同时需要设置形参x/y来分别代表前一个值和前两个值
const fn = (n, x=0, y=1) => {
//
if(n === 1) return x + y
return fn(n-1, y , x + y)
}
console.log(fn(5))
3.使用尾递归倒叙输出正整数 思路: 传入一个正整数,另一个形参代表翻转结果,因为n % 10可以得到个位的值,所以我只需要每次都让n去掉个位,并将去掉的数加到a的后面即可
const fn = (n, a='') => {
if(n === 0) return a
return fn(Math.trunc(n / 10), a + n % 10)
}
console.log(fn(12345))