• 关于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中的例子加以说明,其实自己调试会理解地更好,当然分析当中有些符号只是为了方便打的,不规范,不要太在意。
  • 相关阅读:
    ansible源码解读
    python标准模块(下)
    python学习之算法、自定义模块、系统标准模块(上)
    pathon 基础学习-集合(set),单双队列,深浅copy,内置函数
    python的map,filter,reduce学习
    python 列表
    python生成器、装饰器、正则
    python 模块学习
    python基础学习(一)--数据类型
    时间复杂度的计算
  • 原文地址:https://www.cnblogs.com/7top/p/7245151.html
Copyright © 2020-2023  润新知