V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
nnegier
V2EX  ›  程序员

算法的“递归”有比较好的学习资源推荐吗?

  •  
  •   nnegier · 2 天前 · 2989 次点击
    可能自己移动端开发内存限制栈溢出的原因,所以很少用递归多用队列循环,导致我在递归这块不太熟悉,最近在看书,里面代码有比较多的递归用法,递归我会是会,由外到里,再从里到外,但是不算很熟悉
    第 1 条附言  ·  1 天前
    谢谢大家
    46 条回复    2024-12-16 14:23:15 +08:00
    han777
        1
    han777  
       2 天前
    《计算机程序的构造与解释》
    wyx119911
        2
    wyx119911  
       2 天前
    leetcode 刷几道二叉树的题?
    coool
        3
    coool  
       2 天前
    基于 JavaScript 和 Python 的书:<递归算法与项目实战>
    kapaseker
        4
    kapaseker  
       2 天前
    递归有什么非要用的场景吗?其实这个没有非得学的必要
    nnegier
        5
    nnegier  
    OP
       2 天前 via Android
    @kapaseker 这个还是必须要学,用不用是一回事
    iOCZS
        7
    iOCZS  
       2 天前
    递归有啥特别要学的吗?不过有个尾递归优化的东西。
    iOCZS
        8
    iOCZS  
       2 天前
    更多时候需要结合场景吧,譬如说深度优先遍历,回溯等。
    mumbler
        9
    mumbler  
       2 天前
    科目二都没过,就上路了,你肯定上的不是正规驾校
    dragondove
        10
    dragondove  
       2 天前   ❤️ 1
    初学的难主要还是缺乏可视化的手段吧,还有一个是用递归模拟迭代的多参数混乱。可以看下类似 https://dmytrobaida.github.io/recursion-viewer/ 的工具,然后自己写的时候可以打印点日志,打印的方式是递归方法入口先打印 indent (比如说是 2 个空格)* 递归深度(递归深度作为参数传入)然后方法名加各个参数信息。打印内容可能是类似下面这样
    ```
    |fib(5)
    | |fib(4)
    | | |fib(3)
    | | | |fib(2)
    | | | |2
    | | | |fib(1)
    | | | |1
    | | |3
    | | |fib(2)
    | | |2
    | |5
    | |fib(3)
    | | |fib(2)
    | | |2
    | | |fib(1)
    | | |1
    | |3
    |8
    ```
    这个的源码大概是这样:
    ```scala
    def fib(n: Int, depth: Int = 0): Int =
    println(s"""${"| " * depth}|fib($n)""")
    if n <= 2 then
    println(s"""${"| " * depth}|$n""")
    n
    else
    val r = fib(n - 1, depth + 1) + fib(n - 2, depth + 1)
    println(s"""${"| " * depth}|$r""")
    r

    val res = fib(5)
    ```

    当然,你也可以想办法把这个功能做成装饰器
    amlee
        11
    amlee  
       2 天前
    SICP 有一部分专门讲递归
    levelworm
        12
    levelworm  
       2 天前 via Android
    还是跟着感兴趣的项目来吧,比如说写个 shadow casting 的算法啥的。
    vance123
        13
    vance123  
       2 天前
    6.009 最后几个项目
    786375312123
        14
    786375312123  
       2 天前
    你上 leetcode 做几个 dfs 的题不就好了
    nnegier
        15
    nnegier  
    OP
       2 天前 via Android
    @mumbler #9 回你一句,你以为我在第一层,实际
    nnegier
        16
    nnegier  
    OP
       2 天前 via Android
    @dragondove #10 这个方法很有用,可视化后对算法的稳定性会有更好的认识和认知
    wudiiiii
        17
    wudiiiii  
       2 天前
    力扣刷二叉树 tag 的题,很有帮助。信我,我把二叉树 tag 都刷完了。
    mumbler
        18
    mumbler  
       2 天前
    @nnegier #15 如果你是要深入研究,最好的资料当然是大模型,跟最善于编程的 claude 3.5 sonnet 或者 gemini-exp-1206 聊聊
    bugmakerxs
        19
    bugmakerxs  
       2 天前
    理解了程序调用栈就理解了递归。
    zczy999
        20
    zczy999  
       2 天前   ❤️ 2
    b 站看左程云,把他递归 dp 那一系列题刷一刷 你大概就懂递归啦 这玩意真得刷题 你光看看不懂也不能深入理解
    airw
        21
    airw  
       2 天前
    递归是语法,不是算法。

    函数内部调用函数自身,这一类函数调用的形式,被称为函数的递归。

    理论上所有循环都可以用递归语法来写,但递归不一定能很容易的转化成循环。

    要理解递归函数的执行顺序,可以用树的形式来思考。
    YadongZhang
        22
    YadongZhang  
       2 天前
    FYFX
        23
    FYFX  
       2 天前
    学门函数式语言,然后做练习
    edwardzcn98
        24
    edwardzcn98  
       2 天前
    仅考虑书
    稍微理解《 The Little Schemer 》
    多点理解《 The Little Typer 》
    深入理解《计算机程序的构造与解释》 SICP
    julyclyde
        25
    julyclyde  
       1 天前
    @dragondove 没觉得有啥可视化的必要啊
    这东西单靠想象就足够了
    hello2090
        26
    hello2090  
       1 天前 via iPhone
    不是,这都得学嘛,不就是一个调用一个,一个调用一个嘛。只不过调用的是同一个函数
    IwfWcf
        27
    IwfWcf  
       1 天前
    小学刚学写代码的时候确实觉得递归是遇到的第一个有点难理解的概念,当时觉得难理解的原因是当状态多了,在脑中尝试展开递归时就会觉得混乱。后来发现把握两个重点就很简单了,思考复杂度也比非递归要低

    1.想好最底层的边界条件
    2.写代码时只考虑当前这一层要怎么写,不要去思考之前一层的结果是怎样得到的
    open9527
        28
    open9527  
       1 天前
    把汉诺塔弄明白就差不多了
    Foxkeh
        29
    Foxkeh  
       1 天前
    可以试试这个<<Hello 算法>>
    https://www.hello-algo.com/
    NoOneNoBody
        30
    NoOneNoBody  
       1 天前
    我和你刚好相反,好多时候第一想法是递归,我是比较容易理解递归的,就是“反复”调用自身+判断结束标记而已,可能经常写闭包函数(甚至嵌套的闭包),递归就是特殊的闭包函数,return self(...)
    反而是想避免溢出时,跳离递归就怎么都想不到其他方案
    acorngyl
        31
    acorngyl  
       1 天前
    @zczy999 #20 看见 dp 就跑过来 说左程云了。结果来晚了。
    wnpllrzodiac
        32
    wnpllrzodiac  
       1 天前
    12345 全排列写一下
    dfs 二叉树写一下。
    递个龟 没啥难的。从递归改写成递推才比较难
    zczy999
        33
    zczy999  
       1 天前
    @acorngyl 哈哈你也看左神 他讲的确实好 就是题目选的都挺难的
    acorngyl
        34
    acorngyl  
       1 天前
    @zczy999 #33 B 站前的付费学员了。能把算法这个东西从深度和知识面讲清楚的,很少。他是用刷题的方式把常见“数据结构”和相关“算法”,都拆开,讲明白了。操作系统的内存管理,编程语言的基础类库,用的大部份原理,基本都涉及到了。
    难度还好吧,基本都是通用场景的东西。竞赛题他比较抵触,比如,要求根据数据量或者数据集特性优化,拼 cpu 字长压 io 的东西。
    iorilu
        35
    iorilu  
       1 天前
    第一步, 先把常见循环得算法改成递归

    比如 1+2+...+100 , 正常都是循环实现, 但可改用递归

    反正都可以改, 主要是熟悉下

    然后可以实现汉诺塔这种, 递归明显更合适得算法

    然后就是 2 叉树了
    louzhichen
        37
    louzhichen  
       1 天前
    shimanooo
        38
    shimanooo  
       1 天前
    递归和数学归纳法是深度结合的. 不从这点出发的教材一定不是好教材.
    Binwalker
        39
    Binwalker  
       1 天前   ❤️ 1
    建议去学学 lambda 演算,系统性的学习递归,如何构造递归,Y 组合子之类的都有,推荐这本书《 introduction to functional programming through lambda calculus 》,不过只有英文版
    saka1zd
        40
    saka1zd  
       1 天前   ❤️ 1
    可以看这个 [看到递归就晕?带你理解递归的本质!] https://www.bilibili.com/video/BV1UD4y1Y769
    meilicat
        41
    meilicat  
       1 天前
    @saka1zd 也推荐这个 灵神讲很不错了
    netabare
        42
    netabare  
       1 天前
    @Binwalker +1 ,话说我给对象转码开小灶就是从 lambda 和递归上手的,感觉效果还不错,很多东西一开始讲通了后面再深入就方便很多了。
    baidishenjian
        43
    baidishenjian  
       1 天前
    把递归当成栈来思考就容易很多了
    visper
        44
    visper  
       1 天前
    如果只是我们平时写代码的时候的递归,我还没有问的必要,想得出来就想得出来,基本上就是一个抽象公共子问题的问题。其他无非就是常用的模式去学一下。比如树的 DFS,BFS 这些。但是我感觉不是在问这一层级。
    qwertyzzz
        45
    qwertyzzz  
       23 小时 41 分钟前
    @kapaseker 有啊 作为 crud boy 都有使用场景 一些层级结构
    shaozelin030405
        46
    shaozelin030405  
       20 小时 35 分钟前
    禁用所有循环,用递归来实现所有的循环就行了~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5421 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 02:59 · PVG 10:59 · LAX 18:59 · JFK 21:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.