一道递归程序题,谢
void fun(int x)
{
if(x/2>0)fun(x/2);
printf("%d",x);
}
求fun(10)的输出结果
答案是12510,我总觉得应该是10521 我想知道为什么输出感觉是反的?
[解决办法]
void fun(int x)
{
printf("%d",x);
if(x/2> 0)fun(x/2);
}
这样是你的答案
[解决办法]
需要递归是两个过程,递推和回归
自己画遍图就清楚了
[解决办法]
你想想栈是怎么工作的,或许你会更清楚地!!或者直接用栈写一下
[解决办法]
你的程序很简单,当X/2 > 0也就是说X > 2时,你都会执行fun(x/2)
所以,不会运行到printf直到X == 1时,内层的fun(1)执行printf后返回,
才可能继续执行fun(2)的printf语句,所以结果是12510
[解决办法]
对于递归的算法,首先要搞清楚栈的结构以及程序结束的条件,(栈指针永远指向栈顶,栈不空或程序段没有完结程序就得继续出栈或继续执行)。就拿你的例子简单的分析一下:
void fun(int x)
{
if(x/2> 0)fun(x/2); //递归调用
printf("%d",x); //递归下一位置,暂且叫L1
}
第一次,函数中x值为10,满足x/2>0的条件调用函数fun(x/2);调用时由函数fun负责保护现场,(L1下条执行语句,x值为10)压栈
第二次,函数中x值为5(x/2),满足x/2>0的条件调用函数fun(x/2);调用时由函数fun负责保护现场,(L1,x值为5)
第三次,x值为2,满足x/2>0的条件调用函数fun(x/2);调用时由函数fun负责保护现场,(L1,x值为2)
第四次,x值为1(x/2),不满足x/2>0的条件,执行下条语句即L1语句,于是printf("%d",x),此时x值为1,先输出了1;继续执行->发现程序已经结束->判断栈是否为空->不空->退栈,于是栈指针回到了(L1,x值为2)的现场,执行L1语句,输出了2;
继续执行->发现程序已经结束->判断栈是否为空->不空->退栈,于是栈指针回到了(L1,x值为5)的现场,输出了5;
继续执行->发现程序已经结束->判断栈是否为空->不空->退栈,于是栈指针回到了(L1,x值为10)的现场,输出了10;
这是整个程序的执行流程,楼主仔细分析一下就会慢慢体会的!
[解决办法]
- C/C++ code
void fun(int x) // x=10{ if (x/2>0) { int x2 = x/2; // x2=5 if (x2/2>0) { int x3 = x2/2; // x3=2 if (x3/2>0) { int x4 = x3/2; // x4=1 if (x4/2>0) {}// 递归结束 printf("%d",x4); // 这里输出"1" } printf("%d",x3); // 这里已经输出"12" } printf("%d",x2); // 这里已经输出"125" } printf("%d",x); // 这里已经输出"12510",完毕}
[解决办法]
简单点说就是执行
if(x/2> 0)fun(x/2);
这条语句的时候,先调用fun(x/2);
仔细看就看出来了
[解决办法]
ls几位的答案已经足够详细了,还是不大明白,先传递:
10->5->2->1
再回归:
1->2->5->10
[解决办法]
递归是利用函数杖的过程,就是先进后出!因此你的到的结果是反的!!!!