实例一 : 接受一个整形值,按顺序打印每一位,例:输入1234 输出:1 2 3 4;
在这里我们先使用我们迭代进行处理,这里我们只需要用循环就可以简单实现,实现代码如下;
1. #define _CRT_SECURE_NO_WARNINGS 1 2. #include<stdio.h> 3. #include<math.h> 4. 5. int print(int a) 6. { 7. int i = 0; 8. for (i = 0; i < 4; i++) 9. { 10. int j = 3 - i; 11. int b = pow(10, j); 12. int h = a /b; 13. printf("%d ",h); 14. a = a % b; 15. } 16. return 0; 17. } 18. 19. int main() 20. { 21. int a = 1234; 22. print(a); 23. return 0; 24. }
这里是博主实现的一种方法,既然我们讲的是递归,我们就用递归来实现一下;
递归的思想为:大型复杂的问题转化为与原问题相似规模较小问题
这里我们想打印:1 2 3 4;
我们可以把它分为:123 4;而这个实现就很简单,1234%10=4;
123还可以分为:12 3;实现方法一样,123%10=3;
12分为:1 2;依旧12%10=2;
最后只剩下1;
这时候我们只需要按照从后往前顺序打印即可,其实这就是递归的思想。
前面的一步步剥离往后一步步递,后面的打印过程就是归,那我们应该怎么样实现这个代码呢?
首先我们得明确递归实现的解题过程中遇到的重复计算,其次递归是直接或间接调用自身的一种方法;那我们来看一下这个过程中是否有着重复计算
根据上图不难发现,一直在进行除10与模10;
既然发现,我们不妨自己动手试一下,再试之前,我们得明确递归应满足的条件;
递归的两个条件:
1、 存在限制条件,当满足这个限制条件的时候,递归便不再继续。
2、每次递归调用之后越来越接近这个限制条件。
明确这些,我们先写一个代码看一下,下面是博主写的代码和一些注释
1. void print(unsigned int n) 2. { 3. if (n > 9)//约束条件 4. { 5. print(n/10);//逐渐向约束条件靠近 6. } 7. printf("%d ", n % 10);//当函数不满足约束条件时开始打印,也就是当n=1时 8. } 9. 10. int main() 11. { 12. int a = 1234; 13. print(a); 14. return 0; 15. }
两段代码对比后发现,递归代码量明显减少,下来我们来讲一下上面代码是如何实现的,博主借用了一个大牛的图给大家讲解一下
上面蓝色的线就是递推的过程,把1234一层层剥离,红色的线就是回归的过程,一步一步进行打印。此函数的在内存中开辟空间的方式也借用一下大牛的图给大家进行讲解
每一次函数调用都要在栈区上分配-块内存空间用来保存丽数在调用过程中的上下文的信息。
如果有宝宝想要详细了解的更加详细,可以关注博主,并观看后续博主关于《函数的栈帧的创建与销毁》的讲解。