一道西山居的面试题,求好的解题思路?
#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)