递归

157 阅读1分钟

如果一个函数在内部可以调用其本身,那么这个函数就是递归函数。

简单理解:函数内部自己调用自己,这个函数就是递归函数。

递归函数的作用和循环效果一样

由于递归很容易发生 “栈溢出” 错误(stack overflow),所以必须要加退出条件 return。(return退出循环,退出递归)

var num = 1;
function fn() {
  console.log('我要打印6句话');
  if (num == 6) {
    return; // 递归里面必须加退出条件
  }
  num++;
  fn();
}
fn();

利用递归求数学题

  // 利用递归函数求1~n的阶乘 1 * 2 * 3 * 4 * ...n
	// 5的阶乘就是5×4×3×2×1
  function fun(n) {
    if (n == 1) {
      return 1;
    }
    return n * fun(n-1);
  }
  console.log(fun(3)) // 6
  console.log(fun(4)) // 24
  console.log(fun(5)) // 120
// 利用递归函数求斐波那契数列(兔子序列)1、1、2、3、5、8、13、21...
// 用户输入一个数字 n 就可以求出这个数字对应的兔子序列值
// 我们只需要知道用户输入的 n 的前面两项(n-1 n-2)就可以计算出 n 对应的序列值
function fb(n) {
  if (n === 1 || n === 2) {
    return 1;
  }
  return fb(n-1) + fb(n-2)
}
console.log(fb(3)); // 2
console.log(fb(6)); // 8

利用递归求:根据id返回对应的数据对象

// 递归函数所需数据
let arr = [{
  id: 1,
  name: '家电',
  subs: [{
    id: 21,
    name: '香蕉'
  }, {
    id: 22,
    name: '苹果'
  }]
}, {
  id: 2,
  name: '水果',
}]

// 利用递归函数获取对应ID的数据对象
getItem(data: any, id: number) {
  let obj = {};
  data.forEach(item => {
    if (item.id === id) {
      obj = item;
    } else if (item.subs && item.subs.length > 0) {
      obj = this.getItem(item.subs, id);
    }
  });
  return obj;
}

// 利用递归函数获取对应ID的数据对象 调用
console.log(this.getItem(this.data, 1)); // {id: 1, name: '家电'}
console.log(this.getItem(this.data, 2)); // {id: 2, name: '水果'}
console.log(this.getItem(this.data, 21)); // {id: 21, name: '香蕉'}