1.递归函数:在函数内部自身调用自身的函数。
2.
// 方法:
1:找临界值:无须计算,即可得出的值:---退出递归的条件
2:这一次和上一次运算的关系 fn和fn-1的关系
3:假设当前递归函数可以运行,根据上一次调用自身的结果,写出这次运算的结果。f(n)=f(n-1)+n=>f(10)=f(9)+10=f(8)+10+9
下面用递归 做几道题帮助理解
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
</body>
<script>
// 递归函数:在函数内部自身调用自身的函数。
// 循环能做的所有事情 递归都能做
// 循环做不了的事情 递归也能做
// 方法:
// 1:找临界值:无须计算,即可得出的值:---退出递归的条件
// 2:这一次和上一次运算的关系 fn和fn-1的关系
// 3:假设当前递归函数可以运行,根据上一次调用自身的结果,写出这次运算的结果。f(n)=f(n-1)+n=>f(10)=f(9)+10=f(8)+10+9
// 列:
// 传入一个n,打印n个hello world 递归
// f(n)=f(n-1)+("hello world")
// function printHello(n){
// if (n==1) {
// ("hello world")
// return ;
// }
// ("hello world")
// return printHello(n-1);
// }
// printHello(5)
// 兔子繁殖问题:设有一对新生兔子,从第四个月开始他们每个月月初都生一对兔子,新生的兔子从第四个月月初开始又每个月生一对兔子
// 按此规律,并假定兔子没有死亡,n(n <= 20)个月月末共有多少对兔子?
// 规律: 月份 1 2 3 4 5 6 7 8 9 10 ...
// 兔子 1 1 1 2 3 4 6 9 13 19
// 规律: f(n) = f(n-1)+f(n-3)
// function rabbits(n) {
// if (n <= 3) {
// return 1;
// }
// return rabbits(n - 1) + rabbits(n - 3);
// }
// (rabbits(20))
// (rabbits(10))
// 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃前一天剩下的一半零一个。
// 到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘多少个桃子?
// 10 9 8 7 6 5 4 3 2 1
// 1 4 10 22 46 94 190 382 766 1534
// var sum = 1;
// for (var i = 1; i < 10; i++) {
// sum =(sum+1)*2;
// }
// (sum)
// 规律: f(n) = (f(n+1)+1)*2
// function getTotal(n) {
// if (n == 10) {
// return 1;
// }
// return (getTotal(n + 1) + 1) * 2;
// }
// (getTotal(1))
</script>
</html>
3.递归实现深拷贝
深拷贝请看 个人另一篇文章 有详细解说
function deepClone(obj = {}) {
if (typeof obj !== 'object' || obj == null) {
// obj 是 null ,或者不是对象和数组,直接返回
return obj
}
// 初始化返回结果
let result
if (obj instanceof Array) {
result = []
} else {
result = {}
}
for (let key in obj) {
// 保证 key 不是原型的属性
if ((key)) {
// 递归调用!!!
result[key] = deepClone(obj[key])
}
}
// 返回结果
return result
}
4.递归实现数组扁平化
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>数组扁平化</title>
</head>
<body>
</body>
<script type="text/javascript">
// 数组扁平化概念:数组扁平化是指将一个多维数组变为一维数组
// [1, [2, 3, [4, 5]]] ------> [1, 2, 3, 4, 5]
// 5种方式实现数组扁平化
var arr = [1, [2, 3, [4, 5, [6, 7, 8, [9, 10]]]]]
// flat 扁平化 Infinity number 无穷大
// ((Infinity))
// 注意:flat和flatMap方法为ES2019(ES10)方法,目前还未在所有浏览器完全兼容。
// function flatten1(arr){
// return (Infinity)
// }
// (flatten1(arr))
// 1.递归实现数组扁平化 递归的遍历每一项,若为数组则继续遍历,否则concat 重点
// function flatten(arr) {
// var result = [];
// (item => {
// if ((item)) {
// result = (flatten(item))
// }
// // 不是数组
// else {
// (item)
// }
// })
// return result
// }
// (flatten(arr))
// 2. reduce:遍历数组每一项,若值为数组则递归遍历,否则concat。
// function flatten4(arr) {
// return ((result, item)=> {
// return ((item) ? flatten4(item) : item);
// }, []);
// }
// (flatten4(arr))
// 总结:遍历数组arr,若arr[i]为数组则递归遍历,直至arr[i]不为数组然后与之前的结果concat。
</script>
</html>