递归相关知识

203 阅读2分钟

一、递归概念

递归,在数学与计算机科学中,是指在方法的定义中使用方法自身。也就是说,递归算法是一种直接或者间接调用自身方法的算法。简言之:在定义自身的同时又出现自身的直接或间接调用。

注意:递归必须要有一个退出的条件!

递归算法解决问题的特点:

1)递归就是方法里调用自身。

2)在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口。

3)递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。

4)在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等,所以一般不提倡用递归算法设计程序。在做递归算法的时候,一定要把握住出口,也就是做递归算法必须要有一个明确的递归结束条件。这一点是非常重要的。

其实这个出口是非常好理解的,就是一个条件,当满足了这个条件的时候我们就不再递归了。

例:

(1)n的阶乘

   function f(n){
        if (n==1) return 1
       return n+f(n-1)
    }
    let num2=f(9999)
    console.log(num2);

    function h(n){
        if (n==1) return 1
        return n*h(n-1)
    }
    let num3=h(8)
    console.log(num3);

(2)斐波拉契

问题描述

1,1,2,3,5,8… 递推公式f(n) = f(n-1) + f(n-2)

例:

    function y(n) {
        if (n == 1 || n == 2) {
            return 1
        } else {
            return y(n - 1) + y(n - 2)
        }
    }
    console.log(y(6));

(3)求和

   function fn(n) {
        let num = 0
        if (n != 1) {
            num = n += fn(n - 1)
        } else {
            num++
        }
        return num
    }
    console.log(fn(999));

(4)数组求和

    let arr = [100, 200, 300, [400, 500, [49, 59, 80, [232, 5435, 77]]]]

    function address(obje) {
        let num = 0
    
        if (typeof obje === 'object') {

            for (let i in obje) {
              
                num += address(obje[i])
            }

        } else {
            num += obje
        }

        return num
    }
    console.log(address(arr));

(5)数组对象复杂求和

    let arr1 = [
        {
            name: "张三",
            money: 100,
            children: [
                { name: "张欢欢", money: 200 },
                {
                    name: "张乐乐",
                    money: 100,
                    children: [
                        { name: "张小欢", money: 300 },
                        { name: "张小乐", money: 400 },
                    ],
                },
            ],
        },
        {
            name: "李四",
            money: 100,
            children: [
                { name: "李红红", money: 500 },
                { name: "李明明", money: 600 },
            ],
        },
    ];
    let num = 0;
    function fn(obj) {

        obj.forEach((item, index) => {
            if (item.children) {
                fn(item.children);
            } else {
                return num += item.money
            }
        })

    }
    fn(arr1)
    console.log(num);

(6)字符串翻转

1.png

(7)打印i——j的值

2.png

(8)字符串翻转

3.png

(9)最大公约数

问题描述

最大公约数 f(m,n) = f(n,m%n)

4.png