关于C语言中递归的一点点小问题

最近准备复习考研,慢慢接触一些细节的小问题,可能绝大部分人都是知道的,这篇也就是简单地总结下,顺便更新下博客= =,可能为新手朋友们更好地理解递归。

关于c语言中递归函数调用时,递归函数中返回值的问题。
eg.1 有变量(n)接受递归每层的返回值
int Fact(int n)
{
     if(n >1)
     {
          n *= Fact(n - 1);
     }
     return n;
}
在这个求阶乘的问题中,如果传入n =4,递归调用的返回值是24。但递归函数每一步是如何返回值的呐?
n = 4, n > 1, n = 4 * Fact(3), 此时再调用Fact()函数, 传入的n为3
n = 3, n > 1, n = Fact(3) = 3 * Fact(2), 此时再调用Fact()函数, 传入的n为2
n = 2, n > 1, n = Fact(2) = 2 * Fact(1), 此时再调用Fact()函数, 传入的n为1
n = 1, n !>1,Fact(1) = 1, return n。此时n = 4 * 3 * 2 * 1 = 24。
可以看出,递归函数调用在返回时是逐级返回的。
 
eg.2 无具体变量接受递归每层的返回值
void to_bin(int n)
{
     int r;
     r = n % 2;
     if(n >= 2)
     {
          to_bin(n / 2);
     }
     putchar(r == 0 ? '0' : '1');
     return;
}
这是一个将十进制数转换为二进制的函数,如果传入十进制数为10,输出应该为1010
则第一步n = 10, r = 0, n >= 2, 调用to_bin()函数, 传入参数为5,
第二步,n = 5, r = 1, n >= 2, 调用to_bin()函数,传入参数为2, 
第三步,n = 2, r = 0, n >= 2,调用to_bin()函数,传入参数为1,
第四步,n = 1, r = 1, n !>= 2,调用结束返回
整个过程并不像eg.1中有个变量n来接受递归过程的变化,而是每一步都有输出。
由于递归是逐级返回,所以在最深调用的层次先返回r = 1,也就是先putchar 1,然后接着返回上层putchar 0,同理最后实现输出1010
 
Summary:
     1.当函数调用自身时,也就是在进行递归时,系统会将当前的变量以及形参保留起来,在再调用自身时,系统会为新的变量和形参开辟新的内存空间。
     2.当前调用的函数运行结束时,系统会释放这次调用所占的内存空间,并且返回到上一层的调用点,同时去获取上一层的变量和形参。
     3.递归的过程是逐层进行,调用是从外到里,而返回是从里到外。分有无变量或参数来接受递归每层返回的结果。
 
大部分是参考c primer plus中的例子加以说明,其实自己调试会理解地更好,当然分析当中有些符号只是为了方便打的,不规范,不要太在意。
原文地址:https://www.cnblogs.com/7top/p/7245151.html