一、递归定义
递归(recursion)做为一种算法 在程序设计语言中广泛应用。 在函数内部有直接或间接调用自身的一种方法,核心思想就是把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
递归的能力在于用有限的语句来定义对象的无限集合。 一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。 下面用实例记录一下:
- 阶乘
function factorial(n) {
if (n == 1) return n;
return n * factorial(n - 1)
}
console.log(factorial(5))
// 5 * 4 * 3 * 2 * 1 = 120
2.计算x的n次方
平常计算
function pow(x, n) {
let result = 1;
for (let i = 0; i < n; i++) {
result *= x;
}
return result;
}
使用递归
function pow(x, n) {
if (n == 1) {
return x;
} else {
return x * pow(x, n - 1);
}
}
像开头说的 在函数内部直接调用自身,把问题转化成 如果n = 1,则返回 x; 否则返回 x * pow(x, n - 1);规模较小的问题来求解。
二、应用场景
列举一两个比较常见的
- 斐波那契数列
function fibonacci (n, start = 1, total = 1) {
if(n <= 2){
return total
}
return fibonacci (n -1, total, total + start)
}
2.数组对象格式化
const list = [
{
name: 'zhangsan',
value: 1,
children: [
{
name: 'lisi',
value: 2,
children: [
{
name: 'wangwu',
value: 3
}
]
}
]
}
]
// 转化成如下
const list = [
{
label: 'zhangsan',
value: 1,
children: [
{
label: 'lisi',
value: 2,
children: [
{
label: 'wangwu',
value: 3
}
]
}
]
}
]
// 实现
function copyList(list) {
for (var i = 0; i < list.length; i++) {
if (list[i].name) list[i].label = list[i].name, delete list[i].name;
if (list[i].children) list[i].children = copyList(list[i].children);
}
return list;
}
const newArr = copyList(list);
console.log(newArr);