彻底了解递归

175 阅读1分钟

递归: 是什么 狭义:函数可以自己调用自己的 广义:把问题划分,求解,合并

问题可以划分: 大部分问题都可以划分成小问题,把所有的小问题都解决了,汇总结果得到整体答案 1.划分 2.分别求解 3.汇总 *4.终止条件


阶乘 5!=54321

5!=5*4!

factorial(5)=5*factorial(4)

factorial(5)=5factorial(4) factorial(4)=32! 2=21! factorial(1)=1factorial(0) factorial(0)=0*factorial(-1)


终止条件——基本情况


递归的本质是什么?

函数的本质? 函数调用栈

栈——数据结构 先进后出;后进先出


function show1(a, b){ return a+b; }

function fn2(ccc){ return show1(12, 5)+ccc; }

console.log(fn2(88));


例子


  1. 阶乘
function factorial(n){
  if(n===1) return 1;
  else return n*factorial(n-1);
  
}

console.log(factorial(5));
  1. 求数组最大值
let datas=[29, 8, 17, 6, 3, 19, 27, 81, 2, -6];

function findMax(arr){
  //终止条件
  if(arr.length===0)return undefined;
  else if(arr.length===1)return arr[0];
  else if(arr.length===2){
    if(arr[0]>arr[1])return arr[0];
    else return arr[1];
  }

  //1-划分
  let c=Math.floor(arr.length/2);

  //2-分别求解
  let left=arr.slice(0, c);
  let leftMax=findMax(left);

  let right=arr.slice(c);
  let rightMax=findMax(right);

  //3-合并
  if(leftMax>rightMax){
    return leftMax;
  }else{
    return rightMax;
  }
}

console.log(findMax(datas));

1.png

  1. 数组循环
let datas=[25, 8, 19, 27, 22];

function iteration(arr){
  if(arr.length===0)return;
  else if(arr.length===1){
    console.log(arr[0]);
    return;
  }

  console.log(arr[0]);
  iteration(arr.slice(1));
}

iteration(datas);
  1. 反转数组
let datas=[25, 8, 19, 27, 22];

function reverse(arr){
  if(arr.length<=1)return arr;

  let n=arr[0];
  
  return [
    ...reverse(arr.slice(1)),
    n
  ];
}

console.log(reverse(datas));