Algorithm 教递归技术最好的方法是什么?

Algorithm 教递归技术最好的方法是什么?,algorithm,recursion,Algorithm,Recursion,我正在为新程序员教授竞争性编程 我想教递归,但我不知道什么问题最适合教“递归技术” 我知道很多递归问题,比如计算阶乘、斐波那契数、求解等等 但我不知道新程序员能理解这种递归算法 请告诉我你是否有教递归技术的好主意这是一个非常主观的问题,可能已经结束,但无论如何我都会回答以帮助您 教递归的步骤: 定义: 递归是函数本身重用函数结果的现象。 注: 结束符号是确定函数是否使用自身的逻辑术语 如果没有结束符号,或者结束符号总是false,那么我们就有一个无限递归,这可能导致堆栈溢出 间接递归是一种现

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

我知道很多递归问题,比如计算阶乘、斐波那契数、求解等等
但我不知道新程序员能理解这种递归算法

请告诉我你是否有教递归技术的好主意

这是一个非常主观的问题,可能已经结束,但无论如何我都会回答以帮助您

教递归的步骤:

  • 定义:
  • 递归是函数本身重用函数结果的现象。

  • 注:

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

    • 函数组合是函数调用另一个函数示例时发生的现象(该示例实际上不是函数组合,正如注释部分正确指出的那样):tangent(alpha)=sin(alpha)/cos(alpha)
    • 递归是函数组合的一种特殊情况,在构建f函数的依赖关系树时,我们可以发现f是一个依赖关系
  • 示例:

    • n!(这很简单,我们应该从这个开始)
    • 斐波那契
    • 二进制搜索
  • 显示堆栈是什么,以及如何使用自己的堆栈将递归函数重写为迭代函数

  • 表明递归并不总是最佳答案,例如,斐波那契可以通过一个简单的公式计算,该公式将产生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在评论部分指出,有些过程和方法(取决于工作环境)不返回值,但仍然是递归的。从技术上讲,他是对的,但我仍然相信基于函数的描述将很容易理解,因此,如果它能够适合于函数描述,那么这个案例的解释可能会更好


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

    你应该通过教递归技术来教递归技术。@jornsharpe,LOL,epic comment!从类型开始。显示归纳定义的类型(列表、树…)。解释这些问题自然适合用递归来解决。下面,讨论一些问题是如何由与整体相似的部分构成的,这样搜索的解函数就可以应用到这些部分,就好像它已经被编写过一样。(请参阅和)。请使用递归可以最好地解决的问题来教授递归,而不是通过递归破坏简单的迭代解决方案。这样,您的学生就可以理解递归为什么有用以及何时应用它。我建议去河内塔或是合并塔。保存动态规划课程的子集和。数独是一个很好的例子,你必须使用回溯。@AdrianColomitchi,你评论中所显示的令人自豪的缺乏知识让我震惊。看看三角学的基础知识并学习:@AdrianColomitchi,你的第一个问题是你不相信切线(alpha)=sin(alpha)/cos(alpha)。这个例子确实是有缺陷的,但我希望当一方批评另一方时,会有一些文化、公平,最重要的是正确性。我也希望低评价的男人不要在他们的知识水平之上变得傲慢。最后,我希望这个网站的所有成员都避免涉及个人隐私。你的第三个评论实际上是合理的,你的第一个评论缺乏文化,第二个评论缺乏文化和知识。“另一方面,你评论中的批评方式可能会吓跑较弱的灵魂,使他们不敢回答和提问。”你的观点很好,关于你的编辑:我可以建议你做点什么,在最后一刻之前就指出这个缺陷吗?如果您不想替换这里的示例,至少要以某种方式将其标记为可见(我没有弄错,因此的标记支持
    标记)。如果你不想敲打它,make要小一些(使用
    /
    标签)并加上一个“脚注标记”。无论如何,早点做点什么,不要等到文章结束后才去改正:很多人可能会被错误绊倒,放弃阅读你一半的观点。至于
    tan
    作为组合,那么
    div(sin(x),sin(π/2-x))
    呢?可以应用于您的答案的另一个改进:递归不限于函数c的特定情况