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

#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);
}

你好
首先楼主要知道递归函数的一个特点:
凡是在递归函数之前的语句(本例中就是:(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 之后的也是一样

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-09-17
第一次递归那首先传递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传进了

本回答被提问者和网友采纳
第2个回答  2012-09-17
调用次序是这样的:
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
第3个回答  2012-09-17
对于参数n,首先判断n是否为个位数字这也是递归终止的条件,否则,取其个位也就是模除10,输出个位字符,然后递归n值更新为n/10,直至剩下最后一位数字也就是n/10=0,直接输出其字符,递归结束
相似回答
大家正在搜