【问题标题】:What is the best method for teaching recursion technique? [closed]教授递归技术的最佳方法是什么? [关闭]
【发布时间】:2017-04-11 06:35:22
【问题描述】:

我正在为新程序员教授竞争性编程。
我想教递归,但我不知道什么问题最适合教“递归技术”。

我知道许多递归问题,例如计算阶乘、斐波那契数和求解subset sum problem 等等。
但是我不知道新程序员能理解这种递归算法。
如果您对教授递归技术有一个好主意,请告诉我。

【问题讨论】:

  • 你应该通过教授递归技术来教授递归技术。
  • @jonrsharpe,哈哈,史诗般的评论!
  • 从类型开始。显示归纳定义的类型(列表、树...)。解释这些问题很自然地适合用递归来解决。 IOW,讨论一些问题是如何由与整体相似的部分构成的,因此搜索解函数可以应用于那些部分就好像它已经写好了。 (见thisthis)。
  • 请教递归使用最好用递归解决的问题,而不是通过使其递归来破坏简单的迭代解决方案。这样,您的学生可能会理解递归为何有用以及何时应用它。我建议河内塔或合并排序。保存动态规划课程的子集总和。
  • 数独就是一个很好的例子,你必须使用回溯。

标签: algorithm recursion


【解决方案1】:

这是一个非常主观的问题,可能会被关闭,但无论如何我都会回答以帮助你。

教递归的步骤:

  1. 定义:

递归是函数的结果被函数本身重用的现象。

  1. 注意事项:

    • 结束符号是决定函数是否使用自身的逻辑术语
    • 如果没有结束符,或者结束符总是为假,那么我们有一个无限递归,这可能导致堆栈溢出
    • 间接递归是一种现象,当一个函数没有直接使用它的结果,但它的结果是它调用的函数的依赖项
  2. 数学概念

    • 函数组合是函数调用另一个函数示例时发生的现象(该示例实际上不是函数组合,正如 cmets 部分中正确指出的那样):正切(alpha) = sin(alpha) / cos(alpha)
    • 递归是函数组合的一个特例,在构建一个f函数的依赖树时,我们可以找到f作为一个依赖
  3. 例子:

    • n! (这个太简单了,我们就从这个开始吧)
    • 斐波那契
    • 二分查找
  4. 显示堆栈是什么以及如何使用自己的堆栈将递归函数重写为迭代。

  5. 证明递归并不总是最好的答案,例如斐波那契可以通过一个简单的公式计算,这将在 O(1) 中产生 n 的数字,而如果未优化,则其递归版本是指数的,如果是线性的优化,更不用说在大 n 值上可能出现堆栈溢出的问题。

编辑:

正如 Adrian Colomitchi 正确指出的那样,

正切(alpha) = sin(alpha) / cos(alpha)

实际上并不是函数组合。在这种情况下,让我们不要关注他使用的语言和风格,也不要关注他的错误,让我们关注他批评中他是对的一点。所以,让我们把这个例子改成这个:

n! = n * (n - 1)!

函数调用自身的位置。

函数组合的另一个例子,如评论部分所示:

tan(x) = div(sin(x), sin(π/2-x))

因为 sin(π/2-x) = cos(x)

编辑2:

在评论部分,Adrian Colomitchi 指出,有些过程和方法(取决于工作环境)不返回值,但仍然是递归的。从技术上讲他是对的,但我仍然相信基于函数的描述会很容易理解,所以如果能把这个案例的解释融入到函数描述中,可能会更好。

为了使递归课程易于理解,可以解释它们不是函数,它们仍然起作用并改变状态。这样这个案例就可以完美融入课程。

【讨论】:

  • @AdrianColomitchi,你的评论中表现出的自豪的缺乏知识让我感到震惊。看看三角学的基础知识并学习:en.wikipedia.org/wiki/…
  • @AdrianColomitchi,您的第一个问题是您不相信 tangent(alpha) = sin(alpha) / cos(alpha)。这个例子确实有缺陷,但我希望有一些文化、公平性,最重要的是,当一个人批评另一个人时是正确的。我也希望看到评分低的家伙不要在他们的知识水平之上傲慢自大。最后,我希望这个网站的所有成员都避免变得个人化。您的第三条评论实际上是有道理的,您的第一个缺乏文化,第二个缺乏文化和知识。
  • " 另一方面,您在评论中表现出的批评方式可能会吓跑较弱的灵魂,使其无法回答和提问。"你这里有一个好点,我以后会特别注意的。
  • 关于您的编辑:我可以建议您在最后之前做一些事情来表明缺陷吗?如果您不想在那里替换示例,至少将其标记为可见(我没记错,SO 的降价支持<strike> 标签)。如果您不想打它,请缩小(使用<sub>/<sup> 标签)并添加“脚注标记”。无论如何,早点做一些事情,不要等待你的帖子结束来纠正:许多人可能会偶然发现这个错误并放弃阅读你一半的观点。至于tan作为构图,div(sin(x), sin(π/2-x))呢?
  • 另一个可能适用于您的答案的改进:递归不限制到函数组合的特定情况。想想 8-queens 问题 - 或任何其他树探索问题 - 您可以使用递归,并且理论上可以拥有所有解决方案的详尽集合,而无需将问题定义为函数组合(即 Pascal 过程/Fortran 子例程 - 函数不返回任何内容- 仍然可以递归调用自己)。
猜你喜欢
  • 2013-04-14
  • 1970-01-01
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-12
  • 2010-12-23
  • 2020-10-08
相关资源
最近更新 更多