连续两次递归调用与栈的关系
一次递归与栈的关系
递归调用时,该函数被调用时入栈,执行到函数末尾时出栈。
Age(1)执行完后,函数依次出栈。
连续两次递归调用
在n个括号全排列时遇到的问题
代码如下
void generate_all(string& current, int n, vector<string>& result) {
cout<<" current:"<<current<<endl;
if (n == current.size()) {
if (valid(current)) {
result.push_back(current);
}
return;
}
current += '(';
generate_all(current, n, result);
current.pop_back();
current += ')';
generate_all(current, n, result);
current.pop_back();
}
n=6时输出结果为
current:(
current:((
current:(((
current:((((
current:(((((
current:((((((
current:((((()
current:(((()
current:(((()(
current:(((())
current:((()
current:((()(
current:((()((
current:((()()
current:((())
current:((())(
current:((()))
current:(()
current:(()(
current:(()((
current:(()(((
current:(()(()
current:(()()
current:(()()(
current:(()())
current:(())
current:(())(
current:(())((
current:(())()
current:(()))
current:(()))(
current:(())))
current:()
current:()(
current:()((
current:()(((
current:()((((
current:()((()
current:()(()
current:()(()(
current:()(())
current:()()
current:()()(
current:()()((
current:()()()
current:()())
current:()())(
current:()()))
current:())
current:())(
current:())((
current:())(((
current:())(()
current:())()
current:())()(
current:())())
current:()))
current:()))(
current:()))((
current:()))()
current:())))
current:())))(
current:()))))
current:)
current:)(
current:)((
current:)(((
current:)((((
current:)(((((
current:)(((()
current:)((()
current:)((()(
current:)((())
current:)(()
current:)(()(
current:)(()((
current:)(()()
current:)(())
current:)(())(
current:)(()))
current:)()
current:)()(
current:)()((
current:)()(((
current:)()(()
current:)()()
current:)()()(
current:)()())
current:)())
current:)())(
current:)())((
current:)())()
current:)()))
current:)()))(
current:)())))
current:))
current:))(
current:))((
current:))(((
current:))((((
current:))((()
current:))(()
current:))(()(
current:))(())
current:))()
current:))()(
current:))()((
current:))()()
current:))())
current:))())(
current:))()))
current:)))
current:)))(
current:)))((
current:)))(((
current:)))(()
current:)))()
current:)))()(
current:)))())
current:))))
current:))))(
current:))))((
current:))))()
current:)))))
current:)))))(
current:))))))
对这里的递归调用顺序不是很理解.
以(
→
\rightarrow
→ ((
→
\rightarrow
→ )))
→
\rightarrow
→((((
→
\rightarrow
→(((((
→
\rightarrow
→((((((
→
\rightarrow
→((((()
→
\rightarrow
→(((()
→
\rightarrow
→(((()(为例
从(到((((((递归调用generate(),由于判断条件n==6后,该函数执行结束,弹出栈,执行下一次递归,此时语句执行到
current += '(';
generate_all(current, n, result);
current.pop_back();
//此时语句所在位置
current += ')';
generate_all(current, n, result);
current.pop_back();
执行下一次递归,产生结果为(((((),此时函数执行到末尾,结束
栈顶函数产生string结果为((((,此时也位于代码所在位置,因此执行递归后结果为((((),进入下一次递归,进入上半部,结果为(((()(
以此类推,不进行额外赘述。
通过栈来画图描述
当存在多级递归调用时,可当做多个栈Stack1,Stack2…存放函数,当内层函数执行完成后,执行外层栈顶的函数。
实际应该是保存当前栈顶信息后在栈顶当做新的栈