所有递归函数都需要至少一种递归情况和至少一种基本情况。 递归情况是递归函数调用自身的一组情况。 基本情况是递归函数在不调用自身的情况下返回的一组情况。 这是一个简单的递归阶乘函数,具有一个基本情况和一个递归情况:
如果递归函数的递归情况为零,则它永远不会调用自身并且不是递归函数。 以下错误的阶乘函数有一个基本情况但没有递归情况:
如果递归函数的基数为零,则它永远不会返回,只会递归。 这最终将导致堆栈溢出(除非其他一些。以下错误的阶乘函数具有递归情况但没有基本情况:
正确工作的递归函数还有一个要求:递归函数调用最终必须更接近基本情况。 否则,永远不会达到基本情况,就好像基本情况不存在一样,导致堆栈溢出。 以下错误的阶乘函数有一个递归案例和一个基本案例,但永远不会到达基本案例:
在编写自己的递归函数时,应该问自己三个问题:
什么是基本情况? 传递给递归函数调用的参数是什么? 论点是否更接近基本情况?
如果你想了解更多关于递归的知识,请查看我的书,No Starch Press 的 The Recursive Book of Recursion。