递归之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抛出,而是直接调用自身,在它没有达到停止条件的时候,所有的函数一直处于同一个调用栈,内存开销大,容易内存溢出。但是可以回溯,达到停止条件时,回溯到第一次调用函数的时候,不理解的见下图。
初学编程,欢迎大佬们指正。