初学编程对递归思想很难理解,求前辈指导一下

2020-01-29 16:46:58 +08:00
 w2bgopher

刷题的时候经常遇到需要递归的思想,但是我看答案的递归无法想象出它的结果是什么形成的,感觉十分的抽象,尤其是对于一些树,图的遍历已经其他需要递归完成的操作。

11238 次点击
所在节点    程序员
84 条回复
las917vki
2020-01-29 16:56:01 +08:00
套娃
5G
2020-01-29 16:59:29 +08:00
确实就是套娃,不知道该怎么说
jeffh
2020-01-29 17:00:20 +08:00
书里的递归树你应该能看得懂吧。另外个人总结的一些方法,可以想象成平行宇宙,递归进去的每个方法都是相互独立的。有兴趣的可以看下我写的这篇文章。https://juejin.im/post/5dc55e0651882559181a1274
augustheart
2020-01-29 17:00:50 +08:00
首先简单来说就是在函数中调用一次函数自身。如果你配合堆栈的概念会更容易理解。在堆栈上看,递归是需要开辟新的栈空间的(先不考虑尾递归优化这个特例)),所有的上下文都是全新的,不准确的说,你把递归调用的函数可以看成一个全新的函数,这样你就可以抛开递归这个概念来思考调用过程中到底发生了什么了。
纯自己的理解。
augustheart
2020-01-29 17:03:32 +08:00
当然,考虑到你自称初学者,我就啰嗦一句,理解递归首先要求你对函数调用有足够的理解,你对函数调用有清楚的理解,递归就不难理解
xxx749
2020-01-29 17:03:39 +08:00
teslabcd
2020-01-29 17:04:40 +08:00
@xxx749 哈哈哈哈哈哈哈哈哈哈
ipwx
2020-01-29 17:07:56 +08:00
如果是没有副作用的函数,可以用数学的递推公式来理解。其实这也是理解动态规划最好的方式,什么看代码反而理解不了动态规划。
ipwx
2020-01-29 17:08:36 +08:00
比如斐波那契递推公式:

f(n) = f(n-1) + f(n-2)
f(2) = f(1) = 1
chitanda
2020-01-29 17:14:40 +08:00
以前看一本书,书名忘记了,有个说法,leap of faith。其实我刚开始学递归也是很难理解,我的办法就是干,看一遍不懂看两遍,没事就找出来看看想想
Inside
2020-01-29 17:15:39 +08:00
翻一下高中课本,看看数学归纳法,递归的数学基础就是这个,代码实现是证明的形式。
eason1874
2020-01-29 17:20:40 +08:00
循环重复做一件事,直到符合退出条件。

如果这个循环是通过函数调用自身实现的,就叫递归。
Building
2020-01-29 17:27:20 +08:00
不要想着那些循环概念,其实归递也是调用函数,凡是遇到归递,你就想着调用函数就行了,然后看参数,看流程。
qwerthhusn
2020-01-29 17:40:25 +08:00
斐波拉契
汉诺塔
netlous
2020-01-29 17:44:57 +08:00
这个链接能帮助你了解递归:
https://www.v2ex.com/t/640834
dangyuluo
2020-01-29 17:56:06 +08:00
你需要一个热心的大哥哥,手把手教你用 C 写一个递归函数,然后用 gdb 调试,看一下函数是怎么进入自己的,栈是怎么一步步被吃干净的
xiri
2020-01-29 17:59:49 +08:00
自己把递归的过程画出来
arjen
2020-01-29 18:02:00 +08:00
@netlous 好活
ericgui
2020-01-29 18:06:59 +08:00
写递归,就是套娃
但为了防止无线循环,你记住,任何递归,第一步必然是写退出条件。
t6attack
2020-01-29 18:14:40 +08:00
写一个 遍历文件夹及子文件夹 就理解了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/640834

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX