推荐学习书目
› Learn Python the Hard Way
Python Sites
› PyPI - Python Package Index
› http://diveintopython.org/toc/index.html
› Pocoo
值得关注的项目
› PyPy
› Celery
› Jinja2
› Read the Docs
› gevent
› pyenv
› virtualenv
› Stackless Python
› Beautiful Soup
› 结巴中文分词
› Green Unicorn
› Sentry
› Shovel
› Pyflakes
› pytest
Python 编程
› pep8 Checker
Styles
› PEP 8
› Google Python Style Guide
› Code Style from The Hitchhiker's Guide
gdw1986
V2EX  ›  Python

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

  •  1
     
  •   gdw1986 · Nov 11, 2020 · 5118 views
    This topic created in 2190 days ago, the information mentioned may be changed or developed.


    我是打开调试都想不通到底是怎么实现遍历所有组合的,脑壳疼。
    Supplement 1  ·  Nov 12, 2020

    这个看能不能看到,其实就是对这种写法很好奇,想不通
    22 replies  •  2020-11-13 10:19:34 +08:00
    gdw1986
    gdw1986
    OP
    Nov 11, 2020
    1
    https://imgur.com/cao8ZKd
    补个图片链接,实在不会插图
    JasonLaw
    JasonLaw
    Nov 11, 2020 via iPhone
    2
    cherbim
    cherbim
    Nov 11, 2020
    3
    建议你把问题补充完全,你这代码没有上下文,
    JasonLaw
    JasonLaw
    Nov 11, 2020 via iPhone
    4
    如果我没理解错的话,就是通过递归产生所有可能,然后最后检查是否有效,其实就是 brute force 。但是我不太理解 A.pop()的作用是什么。
    secondwtq
    secondwtq
    Nov 11, 2020
    5
    backtracking 了解下
    metamask
    metamask
    Nov 11, 2020
    6
    回溯法

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

    for sign in ["(", ")"]
    就是做了这么个操作
    先拼接上去,然后检验,不行就去掉,换另一个上去试
    metamask
    metamask
    Nov 11, 2020
    7
    google

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

    for next in "()": dfs([*A, next])

    另外,不是有 step over 么,为什么要行行打断点(
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4782 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 47ms · UTC 02:10 · PVG 10:10 · LAX 18:10 · JFK 21:10
    ♥ Do have faith in what you're doing.