我在递归方面思考/解决问题时遇到困难。我真的很欣赏这个概念,我可以理解它们,例如创建基本情况、退出情况和递归调用等。我可以解决简单的问题,例如在数组中编写阶乘或整数求和。这就是我的思考停止的地方。当问题变得复杂时,我无法真正应用这些概念或提出解决方案。例如,河内塔,虽然我能理解问题和解决方案,但我自己无法想出解决方案。它也适用于其他算法,例如快速排序/二叉树遍历。所以我的问题是
- 掌握它的最佳方法是什么?
- 任何人都可以提出一系列问题或问题,我可以用它作为练习来练习吗?
- 学习功能性语言会帮助我理解吗?
请指教。
递归只是一种思维方式,就像迭代一样。当我们还是孩子的时候,我们并没有被教导如何递归地思考,这才是真正的问题所在。你需要将这种思维方式融入你的武器库中,一旦你这样做了,它就会永远留在那里。
最好的掌握方法:
我发现始终首先弄清楚基本情况很有用,也许一开始它们不是最简单的,但是一旦您开始在基本情况之上构建递归,您就会意识到可以简化它。确定基本情况的重要性在于,首先,您专注于需要以最简单的形式(更简单的情况)解决的问题,这以某种方式为未来的算法绘制了路线图,其次,您确保算法stops。也许不会返回预期的结果,但至少会停止,这总是令人鼓舞的。
此外,它总是有助于弄清楚问题的一个小实例如何帮助您找到问题的更大实例的解决方案。例如,如何构建输入解决方案n
已经有了输入的解决方案n-1
.
递归地解决你能想到的每一个问题。是的,河内塔不是一个很好的例子,它的递归解决方案是非常聪明的解决方案。尝试更简单的问题,几乎是基本问题。
问题清单
-
数学运算:求幂以及您能想到的所有数学运算。
-
字符串处理:回文是一个非常好的练习。在网格中查找单词也很有用。
-
了解树数据结构:在我看来,这尤其是最好的培训。树是递归数据结构。了解它们的遍历(中序、后序、前序、计算其高度、直径等)。几乎树状数据结构上的每一个操作都是一个很好的练习。
-
组合问题:非常重要,组合、排列等。
-
寻找路径:Lee算法、迷宫算法等
但最重要的是,从简单的问题开始。几乎每个问题都有递归解决方案。数学问题非常适合掌握它。每次你看到一个for
循环或一个while
循环,将该算法转化为递归。
编程语言
函数式编程很大程度上依赖于递归。我认为这不会有太大帮助,因为它们本质上是递归的,对于还不太了解递归的用户来说可能很麻烦。
使用一种简单的编程语言,即您最熟悉的语言,最好是一种不会让您的大脑因内存烦恼和指针而烦恼的语言。在我看来,Python 是一个非常好的开始。非常简单,不会打扰您打字或复杂的数据结构。只要该语言能帮助你只专注于递归,那就更好了。
最后一个建议,如果您找不到问题的解决方案,请在互联网上搜索或寻求帮助,完全理解它的作用并继续进行另一个。不要让他们绕过你,因为你想做的是将这种思维方式融入你的头脑.
To 主递归,你首先需要主递归 :)
希望这可以帮助!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)