谁能给仔细讲讲这个递归该咋理解吗?

2020-11-11 22:43:35 +08:00
 gdw1986


我是打开调试都想不通到底是怎么实现遍历所有组合的,脑壳疼。
3954 次点击
所在节点    Python
22 条回复
gdw1986
2020-11-11 22:55:56 +08:00
https://imgur.com/cao8ZKd
补个图片链接,实在不会插图
JasonLaw
2020-11-11 23:23:17 +08:00
cherbim
2020-11-11 23:26:35 +08:00
建议你把问题补充完全,你这代码没有上下文,
JasonLaw
2020-11-11 23:26:54 +08:00
如果我没理解错的话,就是通过递归产生所有可能,然后最后检查是否有效,其实就是 brute force 。但是我不太理解 A.pop()的作用是什么。
secondwtq
2020-11-11 23:37:10 +08:00
backtracking 了解下
freakxx
2020-11-11 23:47:41 +08:00
回溯法

你可以理解,不过你代码少了一行空格行,不然代码就很好理解

for sign in ["(", ")"]
就是做了这么个操作
先拼接上去,然后检验,不行就去掉,换另一个上去试
freakxx
2020-11-11 23:50:35 +08:00
google

回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。 但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。 许多复杂的,规模较大的问题都可以使用回溯法,有“通用解题方法”的美称。
lithbitren
2020-11-12 00:42:41 +08:00
为啥 v2 总是喜欢用境外图床贴图啊,经常看不到图,不过如果说的是回溯算法的其实可以按照递归函数参数走一遍画一颗树出来就知道是怎么遍历的了。顺便,leetcode22 和面试金典 08.09 的最短的 python 题解是我写的,不过那种写法仅适合 py/js 这种全堆解释型语言,其他静态语言还是老老实实 push/pop 比较快。
QingchuanZhang
2020-11-12 01:57:30 +08:00
学一下 dfs 就好了,入栈 push,出栈 pop
gdw1986
2020-11-12 07:09:22 +08:00
@JasonLaw #2 是的,哈哈,被发现了
gdw1986
2020-11-12 08:03:08 +08:00
@lithbitren #8 是的我现在的问题在于不知道是怎么回溯的,我再开调试试试,主要觉得这个写法跟我的想法很契合,但是我没写出来
JasonLaw
2020-11-12 08:31:25 +08:00
@gdw1986 #11 你这个不是 backtracking 吧,比如 n 是 1,你这个算法不是会产生[((, (), )(, ))]四种可能吗?
gdw1986
2020-11-12 08:40:39 +08:00
@JasonLaw #12 不会,有条件的,判断了长度才 append
gdw1986
2020-11-12 08:41:03 +08:00
@JasonLaw #12 而且输入的是 n,不好意思我没贴全
JasonLaw
2020-11-12 09:06:41 +08:00
@gdw1986 #11 你可以看一下 <amp-youtube data-videoid="sz1qaKt0KGQ" layout="responsive" width="480" height="270"></amp-youtube> 这个视频,还有这个 https://stackoverflow.com/a/24372493/5232255
lyyhello
2020-11-12 09:08:26 +08:00
你写两个一模一样的方法体。只是方法名不一样。相互调。你就懂了
gdw1986
2020-11-12 09:40:20 +08:00
@JasonLaw 十分感谢!!
mtrec
2020-11-12 09:53:38 +08:00
本质就是树的遍历 如果你知道先序遍历后序遍历访问节点的时机 那回溯就很好理解了 进入之前做准备动作 判断完成条件 遍历左右子树 离开节点重置
jmc891205
2020-11-12 10:17:29 +08:00
你把子问题的边界条件和递归式想明白 就很容易理解整个递归了
lithbitren
2020-11-12 14:37:59 +08:00
python 全局变量可以直接访问,其实 A 不用放进函数里传参,遍历递归函数可以把 A 的状态作为参考画数,append 的时候就加元素,这里有两个分支,一个左括号一个右括号,右括号数不大于左括号数,左右括号同时等于 n 时输出,pop 的时候就直接减元素,n=3 情况下树很好画的。
不过这代码的条件判断还是不太友好,leetcode 有原题,python 还可以写得更简洁。
https://leetcode-cn.com/problems/bracket-lcci/comments/

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

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

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

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

© 2021 V2EX