通过递归调用函数printd将一个数作为字符串打印出来。
递归调用printd函数的过程:
当n小于0时,首先将’-'打印出来,然后将其转化为其相反数。对n进行取整操作,第一次调用printd函数的参数n=123。它将12传递给了printd第二次调用。
同理,第二次调用又把1传递给printd的第三次调用。
第三次调用printd时,不用再将参数传递给第四次调用了。因为1/10=0。
所以此时调用putchar函数,打印数字1。
接着返回到第二次调用。同理也将先打印2,然后再返回到第一次调用。打印数字3,并在之后结束函数的执行
结合上面的分析,我们从下面这张图可以看出:
递归调用函数的过程大致分为两个阶段:
第一个阶段不断将不同的参数传递到每次的调用中。
第二个阶段是当不符合限定范围时,逆序返回每一次调用,并执行调用之后的语句。
递归函数的执行会占用额外系统堆栈的空间。而且每一次调用堆栈时都会执行许多次入栈和堆栈的操作,所以适用于处理较大的数据
打个比方:堆积木。第一块是放在地面上的,然后一块一块往上堆。取的时候肯定是先拿最上面的积木,
(不然的话,那不是直接倒了吗)一直拿,直到取出地面上的积木为止。
具体程序:
#define MaxSize 100
void itoa(int n,char s[])
{
int i = 0,sign;
void reverse(char[]);
sign = n;
n = (sign >= 0) ? n : -n;
do {
s[i++] = n % 10 + '0';
} while ((n /= 10) != 0);
if (sign < 0)
s[i++] = '-';
s[i] = '\0';
reverse(s);
}
void reverse(char s[])
{
int i, j;
char temp;
for (i = 0, j = strlen(s)-1; i < j; i++, j--)
{
temp = s[i];
s[i] = s[j];
s[j] = temp;
}
}
//print decimal number
void printd(int n)
{
if (n < 0)
{
putchar('-');
n = -n;
}
if (n / 10)
printd(n / 10);
putchar(n % 10 + '0');
}
int main()
{
//char s[MaxSize] = { 0 };
int num = 123;
//itoa(123,s);
//printf("%s", s);
printd(num);
return 0;
}