递归之return

330 阅读1分钟

递归之return

什么是递归?

就是一个不断调用自己的函数,在满足条件时停止调用自己的函数。

为什么要讲return ?

return ?  递归里面的 return, 最近在刷leetcode时用到了递归,leetcode-22括号生成,引发的思考

我平时项目工作中使用的递归大多长这个样子

    const fn = ()=>{
        if(....){
            return res
        }
        ...
        return fn()
    }

上面代码块在使用递归函数时,是通过return将函数抛出调用,结束在上一个函数的生命,孕育出一个新的函数,虽然两个函数一样,但两个函数的调用栈是各自独立的。我记得在以前看过的文章中说这叫尾递归,性能友好。

leetcode-22使用的递归代码

        const generateParenthesis = function (n) {
            let res = []
            // cur :当前字符  left:当前字符左括号 right:当前字符右括号
            // dfs 深度优先搜索,递归,见掘金笔记
            const dfs = (cur, left, right) => {
                console.log(cur)
                if (cur.length === 2 * n) {
                    console.log('-------------')
                    res.push(cur)
                    return
                }
                if (left < n) {
                    dfs(cur + '(', left + 1, right)
                }
                if (right < left) {
                    dfs(cur + ')', left, right + 1)
                }
            }
            dfs('', 0, 0)
            return res
        }
        let n = 2
        generateParenthesis(n)

上面的代码块也是递归函数,在调用自身的时候没有使用return抛出,而是直接调用自身,在它没有达到停止条件的时候,所有的函数一直处于同一个调用栈,内存开销大,容易内存溢出。但是可以回溯,达到停止条件时,回溯到第一次调用函数的时候,不理解的见下图。

image.png

初学编程,欢迎大佬们指正。