一尘不染

掌握递归编程

algorithm

我在递归方面无法解决问题。我真的很喜欢这个概念,我可以理解它们,例如创建基本案例,退出案例和递归调用等。我可以解决一些简单的问题,例如在数组中写阶乘或整数求和。那就是我的想法停止的地方。当问题变得复杂时,我无法真正应用这些概念或提出解决方案。例如,河内塔,虽然我能理解问题和解决方案,但我自己却无法解决。它也适用于其他算法,例如快速排序/二叉树遍历。所以我的问题是

  1. 掌握它的最佳方法是什么?
  2. 谁能提出一个问题或问题清单,我可以将其用作练习练习?
  3. 学习功能语言对我的理解有帮助吗?

请指教。


阅读 329

收藏
2020-07-28

共1个答案

一尘不染

递归只是迭代的一种思考方式。当我们还是个孩子的时候,我们没有被教导要进行递归思考,而这才是真正的问题所在。您需要将这种思维方式整合到您的武库中,一旦这样做,它将永远存在。

掌握的最佳方法:

我发现始终先找出基本案例很有用,也许一开始它们不是最简单的案例,但是一旦您开始在该基本案例之上构建递归,您就会意识到您可以简化它。识别基本情况的重要性在于,首先,您要专注于最简单形式需要解决的问题(更简单的情况),从而以某种方式为将来的算法绘制路线图,其次,请确保算法
停止 。也许没有返回预期的结果,但至少停止了,这总是令人鼓舞的。

此外,它始终可以帮助您找出问题的小实例将如何帮助您找到问题的大实例的解决方案。例如,这就是您如何为n已有输入法的解决方案构建输入法的解决方案n-1

递归解决每个您想到的问题 。是的,河内塔楼不是一个很好的例子,它的递归解决方案是一个 非常聪明的解决方案 。尝试更简单的问题,几乎是基本问题。

问题清单

  1. 数学运算:运算 和您可以想到的每个数学运算。
  2. 字符串处理: 回文是一个很好的练习。在网格中查找单词也很有用。
  3. 了解树数据结构: 特别是IMO最佳培训。树是递归数据结构。了解它们的遍历(顺序,后序,预序,计算其高度,直径等)。几乎所有对树状数据结构的操作都是一项很好的练习。
  4. 组合问题: 非常重要,组合,排列等。
  5. 寻路: 李氏算法,迷宫算法等

但最重要的是, 从简单的问题开始
。几乎每个问题都有一个递归解决方案。数学问题很容易理解。每次看到一个for或多个while循环时,都将该算法转换为递归。

程式语言

函数式编程在很大程度上依赖于递归。我不认为这会有所帮助,因为它们本质上是递归的,并且对于还不太了解递归的用户可能会很麻烦。

使用一种最简单的编程语言,一种您最熟悉的语言,最好是一种不会使您烦恼很多内存烦恼和指针的语言。我认为Python是一个非常好的开始。非常简单,不会打扰您输入或复杂的数据结构。只要该语言帮助您仅专注于递归,它就会更好。

最后一个建议是,如果您找不到问题的解决方案,请在Internet上搜索或寻求帮助,全面 了解
问题的根源,然后再寻求其他建议。不要让他们绕过您,因为您想要做的就是 将这种思维方式融入您的头脑

掌握递归 ,您需要先 掌握递归 :)

希望这可以帮助!

2020-07-28