西山居递归面试题

一道西山居的面试题,求好的解题思路?

#include<iostream>

int cc(int i)
{
    for(;i<4;)
    {
        std::cout<<cc(++i);
    } 
    return i; 
}

int main()
{
    cc(1); 
    return 0;
} 

输出结果:___ ?
答案:输出7次4
我是一名在校学生,想请教一下这道题的好的解题思路,循环和递归放到一起想有点乱,自己做题时用笨办法在纸上一步步画出循环递归过程算次数,思考感觉脑子不太够用,该怎么更好的理解这类循环里带递归的情况?

补充:第一次提问,谢谢大家的回答,就是对我的鼓励。

题目来自:https://www.zhihu.com/question/50552768


看到下面很多人都画了递归树,如下:

我来贡献一个比轮子哥好看的调用树<(╯3╰)>

每条线都是一个递归路径,都是递归到cc(4)时开始回溯cc(4) = 4cc(3) = cc(4) = 4cc(2) = cc(3) = cc(4) = 4cc(1) = 4(然而我们并不输出cc(1)的返回值)数一数一共7个cout所以是7个4咯~就酱~--------------------------------------另外,循环嵌套递归没什么难理解的,如果题主没学过DFS,去看一看肯定有用

作者:Theodore
链接:https://www.zhihu.com/question/50552768/answer/121498074
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

我也跟着画了一个递归树,起初不能理解递归树,其实主要遗落了:cout cc(2)的右子树,每一步都单独来看,由于自己实在太笨了,就不得不改写了一下源程序:

int cc(int i)
{
    //cout << "call cc(" << i << ")" << endl;
    for (; i<4;)
    {
        ++i;
        std::cout << cc(i) << endl;
    }
    return i;
}

慢慢来分析此程序,比如,main中调用的是cc(1)

猜你喜欢

转载自www.cnblogs.com/drfxiaoliuzi/p/9261969.html
今日推荐