js基础知识(十九)--递归

五、递归
递归的核心思想在于将于一个大的问题拆分为小的,从而解决问题
递归就是函数自己调用自己,它的作用和循环基本上一致;
递归能做的事循环也能做,循环能做的事递归也能,而且循环的性能更好,递归的好处,思路比较简单,代码比较容易理解
求6!
6!=5!x 6
5!=4!x 5

1!=1
求num的阶乘思路
6的阶乘
jieCheng(6)—>6jieCheng(5) 120
jieCheng(5)—>5
jieCheng(4) 24
jieCheng(4)—>4jieCheng(3) 6
jieCheng(3)—>3
jieCheng(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));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值