我正在为新程序员教授竞争性编程。
我想讲授递归,但我不知道什么问题最适合教授"递归技术"。
我已经知道很多递归问题,如计算阶乘,斐波纳契数和求解subset sum problem等等。
但我不知道新程序员可以理解这种递归算法。
如果您对教学递归技术有很好的了解,请告诉我。
答案 0 :(得分:2)
这是一个非常主观的问题,可能会被关闭,但无论如何我都会回答你的问题。
教授递归的步骤:
递归是函数本身重用函数结果时的现象。
注意:
数学概念
示例:
显示堆栈是什么以及如何使用自己的堆栈重写递归函数以进行迭代。
显示递归并不总是最佳答案,例如斐波那契可以通过一个简单的公式来计算,该公式将在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)
EDIT2:
在评论部分,Adrian Colomitchi指出,有些程序和方法(取决于一个人工作的环境)不会返回值,但仍然是递归的。从技术上讲,他是对的,但我仍然认为基于函数的描述很容易理解,因此如果它适合功能描述,对这种情况的解释可能会更好。
为了使递归课程易于理解,可以解释它们不是函数,它们仍然起作用并改变状态。通过这种方式,这种情况可以完全适合课程。