我知道什么是递归(当一个patten在它的内部重新出现时,通常是一个在它的一行上调用自己的函数,在一个分拆条件之后.对吧?),如果我仔细研究递归函数,我可以理解它们。我的问题是,当我看到新的例子时,我一开始总是感到困惑。如果我看到一个循环,或者一个映射,压缩,嵌套,多态调用等等,我就知道通过查看它会发生什么。当我看到递归代码时,我的思维过程通常是‘这是吗?’后面跟着“噢,这是递归的”,然后是“我想它必须工作,如果他们说它有效的话。”
那么,你有什么技巧/计划/资源来培养这方面的技能吗?递归是一个奇怪的概念,所以我认为解决它的方法可能也是同样的奇怪和不明显。
发布于 2011-03-11 22:22:34
从一些简单的东西开始,用铅笔和纸来追踪它。是认真的。树遍历算法是一个很好的起点,因为它们比常规迭代更容易使用递归来处理。它不一定是一个复杂的例子,但它是简单的,你可以使用。
是的,这是奇怪的,有时违反直觉,但一旦它点击,一旦你说“尤里卡!”我建议树是递归过程中最容易理解的结构,而且很容易使用铅笔和纸。;)
发布于 2011-03-12 08:29:48
我绝对建议SICP。另外,你应该看看作者的入门课程视频这里;它们令人难以置信地打开了心灵。
另一条与编程无关的道路是读“哥德尔”、“埃舍尔”、“巴赫:永恒的金色辫子”。一旦你通过它,递归看起来就像算术一样自然。另外,你会相信P=nP和你会想要构建思考机器--但它的副作用与好处相比却是如此之小。
发布于 2011-03-11 22:24:11
从本质上说,这只是在练习.参加一般问题(排序、搜索、数学题等)如果您多次应用单个函数,那么看看是否可以找到解决这些问题的方法。
例如,快速排序操作是将列表中的元素移动到两个部分,然后再将自己应用到这两个部分中的每一个。当初始排序发生时,它并不担心在这一点上将这两部分排序。相反,它采用枢轴元素,将所有小于该元素的元素放在一边,将大于或等于的所有元素放置在另一侧。这有意义吗?在那个时候,它如何递归地调用自己来排序这两个新的较小的列表?他们也是名单。只是更小。但他们仍然需要被分类。
递归背后的力量是分而治之的概念。反复地把一个问题分解成性质相同但只是小一些的小问题。如果你做的足够多,最终你就会到达一个唯一剩下的部分已经被解决的地步,那么你只需从循环中返回,问题就解决了。学习你提到的那些例子,直到你理解它们。这可能需要一段时间,但最终会变得更容易。然后尝试处理其他问题,并创建一个递归函数来解决这些问题!祝好运!
编辑:我还必须补充,递归的一个关键元素是保证函数能够停止。这意味着原问题的分解必须不断地变小,最终需要有一个有保证的停止点(在这个点上,新的子问题要么是可解的,要么已经解决)。
https://softwareengineering.stackexchange.com/questions/57243
复制相似问题