连续两次递归的顺序

连续两次递归调用与栈的关系

一次递归与栈的关系

在这里插入图片描述
递归调用时,该函数被调用时入栈,执行到函数末尾时出栈。
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…存放函数,当内层函数执行完成后,执行外层栈顶的函数。
实际应该是保存当前栈顶信息后在栈顶当做新的栈

栈

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值