五、递归
递归的核心思想在于将于一个大的问题拆分为小的,从而解决问题
递归就是函数自己调用自己,它的作用和循环基本上一致;
递归能做的事循环也能做,循环能做的事递归也能,而且循环的性能更好,递归的好处,思路比较简单,代码比较容易理解
求6!
6!=5!x 6
5!=4!x 5
…
1!=1
求num的阶乘思路
6的阶乘
jieCheng(6)—>6jieCheng(5) 120
jieCheng(5)—>5jieCheng(4) 24
jieCheng(4)—>4jieCheng(3) 6
jieCheng(3)—>3jieCheng(2) 2
jieCheng(2)—>2*jieCheng(1) 1
jieCheng(1)—>1
function jieCheng2(num) {
// 1.基线条件,递归停止的条件
if (num === 1) {
return 1;
}
//2.递归条件,如何对问题进行拆分,例如:6!=5!*6,num!=(num-1)*num
return num * jieCheng2(num - 1);
}
console.log(jieCheng2(10));
练习:有一对兔子,年龄超过两个月后,每个月生一对兔子
创建一个函数,求n个月后有多少对兔子
创建一个函数计算斐波那契数列:
1 1 2 3 5 8
一 二 三 四 五 六月
//创建函数,用来获取斐波那契数列的第num个数字
function fib(num) {
// 确定基线条件
if (num < 3) {
return 1;
}
// num-1 、 num-2
return fib(num - 1) + fib(num - 2);
}
console.log(fib(6));
快速排序
思路
1.先从数组中提取一个基数:5
2.创建两个数组,一个叫做left,一个叫做right
left=[] right=[]
3.将数组中的每一个值和基数进行比较
比基数大的放入right
比基数小的,放入到left
left=[1,3,4,2] right=[9,7,8,6]
[1,3,4,2] 5 [9,7,8,6]
4.对left和right两个数组继续重复上述步骤
let nums = [5, 1, 3, 4, 9, 7, 8, 6, 2];
function quickSort(arr) {
// arr是要排序的数组
// 设置基线条件,什么时候不需要排序
if (arr.length < 2) {
return arr;
}
let basic = arr[0];
let left = [];
let right = [];
for (let i = 1; i < arr.length; i++) {
// 将数组中的值全部取出
// console.log(arr[i]);
if (arr[i] < basic) {
// console.log('被放到了左边');
left.push(arr[i]);
} else {
// console.log('被放到了右边');
right.push(arr[i]);
}
}
// 自己调用函数,将left和right进行排序
return quickSort(left).concat(basic, quickSort(right));
}
console.log(quickSort(nums));