题目如下:
接受一个整型值(无符号),按照顺序打印它的每一位
例如:
输入: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);
}
这样递归函数就写好了,最重要的是理解了上面画的示意图。(画图就好了好一会呢,最满意这张图了-_-)
初次学习,如有理解错误,欢迎大家指正!