【C语言-递归】利用递归打印出1234

题目如下:

接受一个整型值(无符号),按照顺序打印它的每一位
例如:
输入:1234  输出:1 2 3 4

题目要求使用递归,那递归思想到底是啥意思呢?

有一个例子很好说明这一点,查字典:

对一个A名词不理解,于是我就去查字典,在对A的解释中,出现一个B名词概念不理解;于是又去查B名词,在查询到B名词的解释后,里面有一个C名词不理解,于是又去查询C名词。

这下C名词我理解了(其实就是一个递归出口),我就理解了之前的B名词,B理解了,我就最终理解了C名词,字典查询结束。

这道题目的思路:

        想用递归实现,就想到一个函数不断调用自己,所以我就画了如图所示的黑框表示调用,但是黑框不可能是无限画下去吧,递归一定有个出口,也就是一个判断语句,满足条件就继续递归调用自己,不满足我就不调用自己,开始回归。

 

        如图所示,递归就是把大问题划分成与原来相似的小问题,我要打印1234,那我就打印123好了,打印123我都会了,我就打印12,不断把要打印的规模缩小,最终我打印1就好了。

       整个过程如同绿线那样,不过最后一次我就不调用自己了,那就是说明我不满足调用条件呗,这个条件怎么找呢?

思路:不断往函数体里面走,最终把1234分解到只有一个数字,也就是1,显然这个只有1位数了,就不用再层层剥离了,所以条件可以设定为:传入的参数大小小于9的时候,我就跳出递归,参数大于9,说明没有分解到只有一位数字,那就继续剥离。

这样我就写出了:

void print(int n)
{
	if (n > 9)      //跳出条件
	{
		
	}
	
	
}

      当传入的值>9,我就继续调用,这样我就在if语句里面加个调用自身函数的语句:

void print(int n)
{
	if (n > 9)      //必须:跳出条件
	{
		print( ? );  
	}
	
	
}

      我每次调用都应该不断去接近这个递归出口,也就是把1234--->1,也就是我调用的时候还要不断分解1234,于是函数的参数变成这样,反映在上图中就是绿线所表达的:

void print(int n)
{
	if (n > 9)      //必须:跳出条件
	{
		print(n / 10);  //必须:逼近跳出条件
	}
	
	
}

上面代码就对应上图中的橙色框,包含了跳出条件和  调用中逼近跳出条件 的语句

回到第一个示意图:

在最后一次我不满足条件的时候,递归结束了,程序绕过if()部分语句体,我就该打印出1了吧

于是在判断下面加入用来打印1 2 3 4的语句

void print(int n)
{
	if (n > 9)      //必须:跳出条件
	{
		print(n / 10);  //必须:逼近跳出条件
	}
	
	printf("%d ", n % 10);
}

这样递归函数就写好了,最重要的是理解了上面画的示意图。(画图就好了好一会呢,最满意这张图了-_-)

初次学习,如有理解错误,欢迎大家指正!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值