![]() | 1 han777 299 天前 《计算机程序的构造与解释》 |
![]() | 2 wyx119911 299 天前 leetcode 刷几道二叉树的题? |
3 coool 299 天前 基于 Javascript 和 Python 的书:<递归算法与项目实战> |
![]() | 4 kapaseker 299 天前 递归有什么非要用的场景吗?其实这个没有非得学的必要 |
7 iOCZS 299 天前 递归有啥特别要学的吗?不过有个尾递归优化的东西。 |
8 iOCZS 299 天前 更多时候需要结合场景吧,譬如说深度优先遍历,回溯等。 |
9 mumbler 298 天前 科目二都没过,就上路了,你肯定上的不是正规驾校 |
![]() | 10 dragondove 298 天前 ![]() 初学的难主要还是缺乏可视化的手段吧,还有一个是用递归模拟迭代的多参数混乱。可以看下类似 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) ``` 当然,你也可以想办法把这个功能做成装饰器 |
![]() | 11 amlee 298 天前 SICP 有一部分专门讲递归 |
![]() | 12 levelworm 298 天前 via Android 还是跟着感兴趣的项目来吧,比如说写个 shadow casting 的算法啥的。 |
![]() | 13 vance123 298 天前 6.009 最后几个项目 |
14 786375312123 298 天前 你上 leetcode 做几个 dfs 的题不就好了 |
16 nnegier OP @dragondove #10 这个方法很有用,可视化后对算法的稳定性会有更好的认识和认知 |
17 wudiiiii 298 天前 力扣刷二叉树 tag 的题,很有帮助。信我,我把二叉树 tag 都刷完了。 |
18 mumbler 298 天前 @nnegier #15 如果你是要深入研究,最好的资料当然是大模型,跟最善于编程的 claude 3.5 sonnet 或者 gemini-exp-1206 聊聊 |
19 bugmakerxs 298 天前 理解了程序调用栈就理解了递归。 |
![]() | 20 zczy999 298 天前 ![]() b 站看左程云,把他递归 dp 那一系列题刷一刷 你大概就懂递归啦 这玩意真得刷题 你光看看不懂也不能深入理解 |
![]() | 21 airw 298 天前 递归是语法,不是算法。 函数内部调用函数自身,这一类函数调用的形式,被称为函数的递归。 理论上所有循环都可以用递归语法来写,但递归不一定能很容易的转化成循环。 要理解递归函数的执行顺序,可以用树的形式来思考。 |
![]() | 22 YadongZhang 298 天前 |
![]() | 23 FYFX 298 天前 学门函数式语言,然后做练习 |
![]() | 24 edwardzcn98 298 天前 仅考虑书 稍微理解《 The Little Schemer 》 多点理解《 The Little Typer 》 深入理解《计算机程序的构造与解释》 SICP |
25 julyclyde 298 天前 @dragondove 没觉得有啥可视化的必要啊 这东西单靠想象就足够了 |
![]() | 26 hello2090 298 天前 via iPhone 不是,这都得学嘛,不就是一个调用一个,一个调用一个嘛。只不过调用的是同一个函数 |
![]() | 27 IwfWcf 298 天前 小学刚学写代码的时候确实觉得递归是遇到的第一个有点难理解的概念,当时觉得难理解的原因是当状态多了,在脑中尝试展开递归时就会觉得混乱。后来发现把握两个重点就很简单了,思考复杂度也比非递归要低 1.想好最底层的边界条件 2.写代码时只考虑当前这一层要怎么写,不要去思考之前一层的结果是怎样得到的 |
28 open9527 298 天前 把汉诺塔弄明白就差不多了 |
![]() | 29 Foxkeh 298 天前 可以试试这个<<Hello 算法>> https://www.hello-algo.com/ |
30 NoOneNoBody 298 天前 我和你刚好相反,好多时候第一想法是递归,我是比较容易理解递归的,就是“反复”调用自身+判断结束标记而已,可能经常写闭包函数(甚至嵌套的闭包),递归就是特殊的闭包函数,return self(...) 反而是想避免溢出时,跳离递归就怎么都想不到其他方案 |
32 wnpllrzodiac 298 天前 12345 全排列写一下 dfs 二叉树写一下。 递个龟 没啥难的。从递归改写成递推才比较难 |
34 acorngyl 298 天前 @zczy999 #33 B 站前的付费学员了。能把算法这个东西从深度和知识面讲清楚的,很少。他是用刷题的方式把常见“数据结构”和相关“算法”,都拆开,讲明白了。操作系统的内存管理,编程语言的基础类库,用的大部份原理,基本都涉及到了。 难度还好吧,基本都是通用场景的东西。竞赛题他比较抵触,比如,要求根据数据量或者数据集特性优化,拼 cpu 字长压 io 的东西。 |
![]() | 35 iorilu 298 天前 第一步, 先把常见循环得算法改成递归 比如 1+2+...+100 , 正常都是循环实现, 但可改用递归 反正都可以改, 主要是熟悉下 然后可以实现汉诺塔这种, 递归明显更合适得算法 然后就是 2 叉树了 |
![]() | 37 louzhichen 298 天前 |
38 shimanooo 298 天前 递归和数学归纳法是深度结合的. 不从这点出发的教材一定不是好教材. |
39 Binwalker 298 天前 ![]() 建议去学学 lambda 演算,系统性的学习递归,如何构造递归,Y 组合子之类的都有,推荐这本书《 introduction to functional programming through lambda calculus 》,不过只有英文版 |
40 saka1zd 298 天前 ![]() 可以看这个 [看到递归就晕?带你理解递归的本质!] https://www.bilibili.com/video/BV1UD4y1Y769 |
![]() | 43 baidishenjian 297 天前 把递归当成栈来思考就容易很多了 |
44 visper 297 天前 如果只是我们平时写代码的时候的递归,我还没有问的必要,想得出来就想得出来,基本上就是一个抽象公共子问题的问题。其他无非就是常用的模式去学一下。比如树的 DFS,BFS 这些。但是我感觉不是在问这一层级。 |
![]() | 45 asLw0P981N0M0TCC 297 天前 @kapaseker 有啊 作为 crud boy 都有使用场景 一些层级结构 |
46 shaozelin030405 297 天前 禁用所有循环,用递归来实现所有的循环就行了~ |