• 对递归的进一步理解


    一句话概括:递归是一样的代码,不一样的栈空间!

    了解了进程栈、线程栈、函数栈和进程代码段的基础知识(可参见我的相关博客)之后,看到一个个函数看到的不是函数,而是一个个的栈空间!
    再看递归函数,看到的是每次调用自身(我管它是不是自身呢!)都会开辟一个栈空间。递归调用就是循环地产生很多同样结构的栈空间——里面保存的数据不一样。

    因此可以总结下:
    递归就是数据不同,但是处理相同,栈记录不同的数据,代码段是同一份。——这也是递归可以改成for循环的原因。

    递归函数执行时,每一次调用自身都会开辟一个栈空间,把不同的数据存到栈空间,所以我说栈记录不同的数据。

    而这开辟栈的操作都是同一份代码,就好像在原地转圈圈,但是开辟了很多栈空间,等到递归回来的时候又毁灭掉一个个的栈空间。

    其实应该画个图,进行图形化讲解。了解了进程栈、线程栈、函数栈和进程代码段的基础知识后,提到递归就不再停留在“自己调用自己”的层次上了,而是应该头脑有画面——栈空间不断开辟和销毁的画面

    改天有空画画图,其实对于新人来说直接搜索入栈出栈的基础知识加图形绘画,再结合递归就能明白了。
    递归应该属于栈的知识板块。
    将递归与栈结合下即可明白递归是个什么玩意儿。

    递归理解层次:
    第一层次:浮于表面的似懂非懂的教科书上的死记硬背的“递归是自己调用自己”。
    第二层次:递归是同一份代码开辟不同栈空间保存不同数据,按递归层次进行相同的处理。——缺少动态图。

    关键点
    1.不同递归层次的数据放到对应层次的栈空间。
    2.对栈空间保存的数据处理流程一致——即重复处理是循环和递归诞生的基石和根本。
    3.递归就是对不同数据的搜索和分别处理,但处理都相同。处理这块是同一份代码,即cpu的pc指针从未离开过递归函数处理的那块代码,pc一直在这块代码里指来指去永不变(未达出口时),而变的只是栈空间里的数据!
    4.递归不同层次的数据可以互相独立也可以有依赖关系,这倒无所谓,这不是重点,重点是递归的处理都是一样,即重复重复重复,重要的事情说三遍,重复是一大特点。
    5.一句话概括:递归是一样的代码,不一样的栈空间! 你看一个个的栈空间都是执行同一份代码形成(开辟)的,然后我这同一份代码到各个栈空间去处理不同的数据!仅此而已!

  • 相关阅读:
    Linux常用命令速查手册——嘎嘎管用
    面试官:Kafka是什么,它有什么特性与使用场景?
    2022年高教社杯数学建模竞赛A题 B题 C题 D题 E题思路
    凭借SpringBoot整合Neo4j,我理清了《雷神》中错综复杂的人物关系
    P4316 绿豆蛙的归宿 ( 拓扑 + 期望dp
    7. RxJava总结
    重识Nginx - 11 使用ngx_http_proxy_module的proxy_cache搭建一个具备缓存功能的反向代理服务
    论文阅读《Large-Scale Direct SLAM with Stereo Cameras》
    hive语法
    android studio 加载html文件(备忘)
  • 原文地址:https://blog.csdn.net/yhb1206/article/details/126198662