教授递归技术的最佳方法是什么?

时间:2016-11-27 12:39:51

标签: algorithm recursion

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

我已经知道很多递归问题,如计算阶乘,斐波纳契数和求解subset sum problem等等。
但我不知道新程序员可以理解这种递归算法。
如果您对教学递归技术有很好的了解,请告诉我。

1 个答案:

答案 0 :(得分:2)

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

教授递归的步骤:

  1. 定义:
  2. 递归是函数本身重用函数结果时的现象。

    1. 注意:

      • 结束标志是确定该功能是否会自行使用的逻辑术语
      • 如果没有结束符号,或者结束符号始终为false,那么我们会有无限递归,这可能会导致堆栈溢出
      • 间接递归是一种现象,当一个函数没有直接使用它的结果时,但它的结果是它调用的函数的依赖
    2. 数学概念

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

      • N! (这很简单,我们应该从这个开始)
      • 斐波
      • 二元搜索
    4. 显示堆栈是什么以及如何使用自己的堆栈重写递归函数以进行迭代。

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

    6. 编辑:

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

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

      实际上不是功能组合。让我们不要把注意力集中在他所使用的语言和风格上,也不要把他的错误放在他的错误上,让我们把注意力集中在他批评他认为正确的单点上。那么,让我们将这个例子改为这个例子:

      N! = n *(n - 1)!

      函数调用自身。

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

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

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

      EDIT2:

      在评论部分,Adrian Colomitchi指出,有些程序和方法(取决于一个人工作的环境)不会返回值,但仍然是递归的。从技术上讲,他是对的,但我仍然认为基于函数的描述很容易理解,因此如果它适合功能描述,对这种情况的解释可能会更好。

      为了使递归课程易于理解,可以解释它们不是函数,它们仍然起作用并改变状态。通过这种方式,这种情况可以完全适合课程。