求C高手解释一下一下程序是怎么得出-123这个结果的,主要是递归那里没看明白。

#include"stdio.h"voidconvert(intn){inti;if((i=n/10)!=0)convert(i);putchar(n%10+'0');}... #include "stdio.h"
void convert(int n)
{
int i;
if((i=n/10)!=0)
convert(i);
putchar(n%10+'0');}
void main()
{int number=-123;
if(number<0)
{putchar('-');
number=-number;

}
convert(number);
}
展开
 我来答
未来需努力点缀
2012-09-17 · TA获得超过4679个赞
知道大有可为答主
回答量:850
采纳率:50%
帮助的人:522万
展开全部
你好
首先楼主要知道递归函数的一个特点:
凡是在递归函数之前的语句(本例中就是:(i=n/10)!=0)执行顺序和递归函数相同
凡是在递归函数之后的语句(本例中就是:putchar(n%10+'0'))执行顺序和递归函数相反
并且递归函数在执行的过程中会保存它的参数值

以下是改程序的执行流程:
number=-123<0 -> 显示‘-’ number=123
convert(123) -> 进入递归函数 n=123
i=n/10=12 不为0 -->继续执行 保存n=123
convert(12) n=12
i=n/10=1 不为0 -->继续执行 保存n=12
convert(1) n=1
i=n/10=0 为0
执行递归函数后面的语句:putchar(n%10+'0'))
分别取出n保存的值:1 12 123
n=1 -> n%10+'0'='1' 显示'1'
n=12 -> n%10+'0'='2' 显示'2'
n=123 -> n%10+'0'='3' 显示‘2’
然后组合'显示' -> 就是-123

希望能帮助你哈
追问
i 会变成12.n怎么会变成12?
追答
每次递归的时候传递了实参i给了形参n i是12 那么n就是12 之后的也是一样
try_ok
2012-09-17 · TA获得超过211个赞
知道小有建树答主
回答量:423
采纳率:0%
帮助的人:260万
展开全部
第一次递归那首先传递123,n=123,n/10=12,则i=12,i!=0;
第二次调用递归函数,传进来的n=12。
此时n=12,n/10=1,则i=1,i!=0;
第三次调用递归函数,传进来n=1。
此时n=1,n/10=0,i==0,不调用递归函数,执行putchar(n%10+'0');},1%10=1,1+‘0’,就是把整型的1转化为字符型用putchar输出。
第三次递归完毕,输出了1
然后回到第二次递归,继续执行putchar(n%10+'0');},12%10=2,再转化为字符型,输出
第二次递归完毕,输出了12
回到第一次递归,再执行putchar(n%10+'0');},123%10=3,再转化为字符型,输出
第一次递归完毕,最终输出123。
结束
追问
请问第二次n怎么会是变成12。
追答
因为第二次递归,i=12啊,调用convert(i);实参是i,不就是把12传进了
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
六季相灭1d
2012-09-17 · 超过59用户采纳过TA的回答
知道小有建树答主
回答量:129
采纳率:33%
帮助的人:88.2万
展开全部
调用次序是这样的:
n=123, convert(123) => convert(12) => convert(1)
返回值次序 : convert(1) =1, 因为n=1
||
convert(12) =2, 因为n=12
||
convert(123) = 3, 因为n=123
||
最后: 123 再加上前面的符号 -123
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
1548669491
2012-09-17 · TA获得超过317个赞
知道小有建树答主
回答量:258
采纳率:0%
帮助的人:108万
展开全部
对于参数n,首先判断n是否为个位数字这也是递归终止的条件,否则,取其个位也就是模除10,输出个位字符,然后递归n值更新为n/10,直至剩下最后一位数字也就是n/10=0,直接输出其字符,递归结束
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式