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

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

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

11282 次点击
所在节点    程序员
84 条回复
ryanpenber
2020-01-29 21:35:04 +08:00
你去事业单位办事,你对业务员说,你要取出你保存的合同内容。业务员说稍等,我要请示值班经理;值班经理听了以后也不知道怎么办,说我去请示单位领导;单位领导觉得没处理过这个案例,请示区域经理;区域经理说:这点小事都办不好?合同是 XXXXX。单位领导拿到以后,把合同拿给值班经理,值班经理拿到了合同给了业务员;业务员把合同交给了你。

程序返回的结果由下一层程序提供,这是我理解的递归
52coder
2020-01-29 21:55:22 +08:00
递归你可以理解为有限次函数调用,调用到最后一次后,再层层向上返回。
jdz
2020-01-29 22:09:46 +08:00
可以看下《计算机系统概括》,其中有一章专门讲递归
versee
2020-01-29 22:13:49 +08:00
1.不要人肉追踪函数的调用,你深入几层以后根本拔不出来
2.写好递归停止的条件以后,把每次的函数调用当成一个立即得到答案的黑盒
ebony0319
2020-01-29 22:16:00 +08:00
就是数学里面的抽象函数,类似于:f(x)=f(x-1)+1,这种一般会给一个条件:已知 f(1)=1
omph
2020-01-29 22:16:21 +08:00
通过树结构来理解
AX5N
2020-01-29 22:41:50 +08:00
感觉楼上基本都是在讲废话,楼主要听得懂你们说的那些还问么。
fluorinedog
2020-01-29 23:40:22 +08:00
楼主研究一下数学归纳法吧,和递归的思想是一模一样的。
首先,对于 trivial 的情况,直接算得解,如同数学归纳法的初始条件。
然后,假设我们已经有一个函数可以拿到 k-1 的情况,要计算 k,可以直接用 k-1 的结果,如同数学归纳法的迭代部分。
这两者共同的核心是,我们得相信 k-1 的情况已经 magically 解决了,不要在这个地方引入思想负担。重点得关注 k-1 到 k 的变换过程。
jakezh
2020-01-29 23:51:40 +08:00
adang313
2020-01-30 00:22:59 +08:00
我也在学习中
SlipStupig
2020-01-30 00:54:36 +08:00
自己给自己打电话
levelworm
2020-01-30 01:07:52 +08:00
我也不太擅长递归。我觉得基本思想很好理解,就是把任务分解成相同性质的小任务。但是我觉得有两个难点,一个是理解每次递归之后必然会返回到上一层,第二个是如何分解。我觉得这个和智商有关,我这种智商不够的就只能先硬来,做的多了就好些。
DamienS
2020-01-30 01:10:25 +08:00
你这样想。

1. 我(当前的 function )只管当前要做的事情。
2. 其他的逻辑由其他递归的 function 来做。我(当前的 function )不知道他们怎么做出来的,但是我就 assume 他们运行完拿到了正确的结果。


比如 recursively 打印二叉树中序 node。


sudo code 是

recurPrint:
if(currentNode==null){
return;
}

recurPrint(Left Node)

print(current Node)

recurPrint(Right Node).


这个就是我 assume recurPrint(Left Node) 和 recurPrint(Right Node) 都运行正确。我就把当前的 node 打出来了 print(current Node)。


做完这个逻辑后需要确认 recurPrint(Left Node) 和 recurPrint(Right Node) 真的能运行成功。那就想下有什么特殊的需要处理的 case。就是当前 node 是 null 时,这时不打印直接返回,整个逻辑就 ok 了
alphatoad
2020-01-30 04:03:30 +08:00
要理解递归,你必须理解递归
Shook
2020-01-30 04:13:51 +08:00
可能应该多写写树的题目,比如如何寻找节点。
happyz90
2020-01-30 06:41:03 +08:00
感觉汉诺塔来演示递归还是挺形象的
52coder
2020-01-30 08:31:26 +08:00
@alphatoad 卧槽,一大早看到你这个解释有点禅意了,比我的评论精辟了。
ioriwong
2020-01-30 08:47:40 +08:00
大家忽略了“初中生”,数学归纳法,递推数列 都没学
SharkU
2020-01-30 09:56:32 +08:00
只要问题可以进行向下分解,并最终可以直接进行求解。
[递归]( https://segmentfault.com/a/1190000007420201)
zhw2590582
2020-01-30 11:19:08 +08:00
刚开始会不容易理解,等接触多了,练习多了就慢慢熟练了,我以前和你一起看见递归就头疼

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

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

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

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

© 2021 V2EX