标签:
我们来看这样一个例子。
程序功能:
将十进制数转化为二进制数的程序。用直接递归实现。
#include <stdio.h>
void f(int n)
{
if(n){
f(n/2);
}
else
return;
printf("%d",n%2);
}
void main(){
int a = 10;
f(a);
printf("\n");
}
理解如下:
(1)、直接递归就是自己调用自己,其实可以理解为像是主函数调用子函数一样,子函数执行完了之后就返回主函数没有完成的部分继续执行主函数未完成的内容;
(2)、函数的调用会开辟新的存储空间,用于新函数的数据存放,同时,主调函数原有的变量由于它没有运行完(还有printf("%d",n%2); 这一句没执行),所以里面的变量不会被释放,依旧保留了下来。
按照我学单片机的思想,好像就是在主调函数调用其其它函数之前,会进行现场保护,也就是把断点的地址压入堆栈,不然后面返回主调函数的时候找不到地址回不来。
(3)每次被调函数执行完了以后(或者遇到return语句),才会释放里面的存储空间,返回主调函数执行主调函数未完成的部分,继续执行主调函数的内容。
于是得到了下面的这个图。程序从第1步开始到第10步,完成整个递归的过程。
其实就是一层一层的调用,然后一层一层的返回,打印的数值是相对应的每一层的变量的值。这样应该很好理解了。
所以打印的结果是从最里层开始到最外层。结果如下。
PS: 个人愚见,高手勿喷。
标签:
原文地址:http://www.cnblogs.com/tanzhuolin/p/5051118.html