递归函数 以及递归实现数组扁平化 和递归实现深拷贝

时间:2025-01-18 20:45:47

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>