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

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

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

11699 次点击
所在节点    程序员
84 条回复
yjxjn
2020-01-30 11:22:54 +08:00
我给你讲个故事:
从前有座山,山上有座庙,庙里有个老和尚和小和尚,老和尚对小和尚说:从前有座山,山上有座庙,庙里有个老和尚和小和尚,老和尚对小和尚说:从前有座山,山上有座庙,庙里有个老和尚和小和尚,老和尚对小和尚说:从前有座山,山上有座庙,庙里有个老和尚和小和尚,老和尚对小和尚说:从前有座山,山上有座庙,庙里有个老和尚和小和尚,老和尚对小和尚说:从前有座山,山上有座庙,庙里有个老和尚和小和尚,老和尚对小和尚说:从前有座山,山上有座庙,庙里有个老和尚和小和尚,老和尚对小和尚说:从前有座山,山上有座庙,庙里有个老和尚和小和尚,老和尚对小和尚说:

理解了吗???哈哈
chengxiao
2020-01-30 11:27:14 +08:00
照着书上的写,多写几次级明白了
写着写着就明白了
by73
2020-01-30 11:30:21 +08:00
学下 functional programming 就好,用数学的方式去理解它。当然还有其他方式是去 leetcode 之类的地方,用递归实现下链表、树之类的操作算法。
bullfrog
2020-01-30 12:06:02 +08:00
1.在一个副本里进入到另一个副本,退出副本的时候还是之前哪个副本
2.盗梦空间
herozzm
2020-01-30 13:11:28 +08:00
A 是确诊患者,然后 Ta 做高铁回家,一个车厢的其他人是 B,然后 B 们又去其他地方接触其他人,利用递归可以最终得到所有接触过的人员
bugmakerxs
2020-01-30 13:44:35 +08:00
方法栈理解清楚了,递归就懂了,递归其实就是一次普通的方法调用而已
netty
2020-01-30 13:46:55 +08:00
极客时间的《数据结构与算法讲得不错》:
1.编写递归代码的关键是,只要遇到递归,我们就把它抽象成一个递推公式,不用想一层层的调用关系,不要试图用人脑去分解递归的每个步骤。
2.写递归代码的关键就是找到如何将大问题分解为小问题的规律,并且基于此写出递推公式,然后再推敲终止条件,最后将递推公式和终止条件翻译成代码。

文档:10_递归:如何用三行代码找到“最终推荐人”? 链接: http://note.youdao.com/noteshare?id=d026fcabe93136f02c95efc449c6624f
netty
2020-01-30 13:49:45 +08:00
然后多实践,徒手写,从最简单的阶乘和斐波那契数列开始
kaifeii
2020-01-30 16:35:56 +08:00
所有递归都可以用栈替代,递归只是把一部分过程数据记录在函数栈里了。
建议你先学会堆栈结构,然后了解一点编译原理,然后你就知道把可以把递归的每一层局部变量包括入参压到栈里。
从几个市面上标准的简单递归代码开始做栈化练习,多做几次你就都懂了。
为了防止 stackoverflow,实际应用上也要用栈代替递归,迟早要学的。
rainbowchou
2020-01-30 16:48:11 +08:00
楼上说的很有道理啊 就是数据结构 栈 ,函数调用就是把数据压入栈 弹出栈操作,递归就是全压入,然后倒序弹出,先学学数据结构吧
HhZzXx
2020-01-30 16:51:41 +08:00
首先,一个函数(比如 A 函数)是有提供了一定特性的,即对外提供某种服务,比如 `String toString(node)` 方法对外提供 ”获得以 node 为根节点的子树的字符串描述“ 这个服务。
那么,我们在递归函数 A 里调用函数 A 时,无需考虑那么多,直接就是:”调用这个 A 函数,获得其提供的服务“,然后我们基于其提供的服务,构建我们这个函数对外提供的服务。
例子:
String toString(node) {
if(node==null) {
return "";
}
a = toString(node.left);
b = toString(node.right);
return a + node.head + b;
}
我们调用 toString(node.left) 和 toString(node.right)获取 left 子树和 right 子树的字符串描述,基于此,构建出我们对外提供的服务 ”a + head + b“。当然,递归是有终止条件的,所以得判断 node 为 null 时就返回空串
marlondu
2020-01-30 20:26:46 +08:00
简单点,不要看他们扯那么复杂,递归,就是在函数里自己调自己。
xutao881
2020-01-30 20:49:47 +08:00
let num = 0;

f a(){
if(num>10){

}
}
xutao881
2020-01-30 20:50:35 +08:00
妈耶,没打完就回复了。。。意思就是条件不满足的时候调用自己,满足之后 return
wnpllrzodiac
2020-01-30 20:55:34 +08:00
汉诺塔,当初想了好几个小时
Electronika
2020-01-31 00:44:07 +08:00
@netlous hhhhh
ajaxfunction
2020-01-31 10:29:25 +08:00
如果是会用,多写几次就可以了,
如果想理解,必须明白堆栈的概念和函数生命周期和变量作用域,特别是堆栈
timwu
2020-01-31 15:39:33 +08:00
看我这篇博客文章: https://wuzhiwei.net/ds_app_stack/ 栈 递归 汉诺塔
GAsss
2020-01-31 15:45:42 +08:00
可以看看 The Little Schemer
Kaakira
2020-01-31 17:23:15 +08:00

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

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

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

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

© 2021 V2EX