距离上次更新本文已经过去了 693 天,文章部分内容可能已经过时,请注意甄别

简单的 Print 递归

说句题外话,很多时候单词我是认识的,但是如果它全大写了,我总要反应老一会才能想出来它的意思

有和我一样的人吗?

今天的 c 语言课讲到了一道非常经典的递归题目

代码如下:

c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>

void Print(int n)
{
if (n > 9)
Print(n / 10);
printf("%d ", n % 10);
}

int main()
{
int num = 0;
scanf("%d", &num);
Print(num);
return 0;
}

结果如下

image-20211026150003493

运行顺序

谈到递归的时候,最重要的就是要弄明白它究竟是怎么运行的

老师上课讲的方法非常直观的表示了它的运算顺序

这里我用粘贴代码块的方式来展示

刚开始执行的是 scanf 输入,这里不再赘述

c
1
2
3
4
5
6
void Print(int n)
{
if (n > 9)
Print(n / 10);
printf("%d ", n % 10);
}

这一块是我们递归的主体

c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void Print(int n)
{
if (n > 9)
Print(3578 / 10);
if (n > 9)
Print(357 / 10);
printf("%d ", 357 % 10);//7
if (n > 9)
Print(35 / 10);
printf("%d ", 35 % 10);//5
if (n > 9)//这时候值为3,已经不满足条件
Print(3 / 10);//该语句不执行
printf("%d ", 3 % 10);//3
printf("%d ", 3578 % 10);//8
}

看起来可能有点乱,在这基础上加上一些箭头就会清晰了

image-20211026152021761

起初我的想法是,在进行 if 判断之后,会先执行下面的 printf,即先打印最后一位数 8,再向前打印


实际上,if 语句后的 Print 函数的嵌套调用是在下一行 printf 之前的、

也就是说它需要像图中这样完全调用完,直到 if 判断为假后,才会从后往前运行 printf 语句

这才有了最开始我贴的结果

程序依次打印了每一位的数字

image-20211026150003493


如果这篇博客对你有帮助,还请点赞收藏支持一下!万分感谢!