100 Days of Code-day20

通过递归调用函数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;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值