递归: 是什么 狭义:函数可以自己调用自己的 广义:把问题划分,求解,合并
问题可以划分: 大部分问题都可以划分成小问题,把所有的小问题都解决了,汇总结果得到整体答案 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));
例子
- 阶乘
function factorial(n){
if(n===1) return 1;
else return n*factorial(n-1);
}
console.log(factorial(5));
- 求数组最大值
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));
- 数组循环
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);
- 反转数组
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));