• C Primer Plus(6) 中文版 第9章 函数 9.3 递归


    9.3 递归
    C允许函数调用它自己,这种调用过程称为递归(recursion)。递归有时难以捉摸,有时却很方便实用。结束递归是使用递归的难点,
    因为如果递归代码中没有终止递归的条件测试部分,一个调用自己的函数会无限递归。
    可以使用循环的地方都可以使用递归。有时用循环解决问题比较好,但有时用递归更好。递归方法更简洁,但效率却没有循环高。
    9.3.1 演示递归
    main()函数调用up_and_down()函数,这次调用称为“第1级递归”。然后up_and_down()调用自己,这次调用称为“第2级递归”。接着
    第2级递归调用第3级递归,一次类推。
    %p转换说明打印地址,如果你的系统不支持这种该是,请使用%u或%lu代替%p)。
    /* recur.c -- recursion illustration */
    #include
    void up_and_down(int);

    int main(void)
    {
        up_and_down(1);
        return 0;
    }

    void up_and_down(int n)
    {
        printf("Level %d: n location %p\n", n, &n); // 1
        if (n < 4)
            up_and_down(n+1);
        printf("LEVEL %d: n location %p\n", n, &n); // 2
        

    /* 输出:

    */ 

    注意,每级递归的变量n都属于本级递归私有。这从程序输出的地址值可以看出(当然,不同的系统表示的地址格式不同,这里关键要注意,Level 1和LEVEL 1的地址相同,Level 2和LEVEL 2的地址相同,等等)。
    如果觉得不好理解,可以假设有一条函数调用链---fun1()调用fun2()、fun2()调用fun3()、fun3()调用fun4()。当fun4()调用结束后,控制传回fun3();当fun3()调用结束后,控制传回fun2();当fun2()调用结束后,控制传回fun1();递归的情况与此类似,只不过fun1()、fun2()、fun3()、fun4()都是相同的函数。

  • 相关阅读:
    Kafka收发消息核心参数详解
    丹磺酰荧光素/5-羧基四甲基罗丹明标记PLGA纳米载体,Dansyl-PLGA,TMR-PLGA,齐岳
    用Flask构建一个AI翻译服务
    音乐播放器蜂鸣器ROM存储歌曲verilog,代码/视频
    过滤器和监听器
    SpringBoot实用开发篇复习4(实用开发篇完)
    vue 概述
    WebAssembly不是软件!它是计算机中的计算机
    OpenCV(二十九):图像腐蚀
    Vue+springboot银首饰商城销售系统java
  • 原文地址:https://blog.csdn.net/weixin_40186813/article/details/126233136