调用自身的函数称为递归函数,这种技术称为递归。
这种特殊的编程技术可以通过将问题分解为更小、更简单的子问题来解决。
举个例子可以帮助阐明这个概念
我们以计算一个数的阶乘为例。正整数的阶乘定义为从 1 到该数的所有整数的乘积。例如,5 的阶乘(表示为 5!
)是
5! = 1*2*3*4*5 = 120
计算 5 的阶乘这个问题可以分解为计算 4 的阶乘乘以 5 的子问题。
5! = 5*4!
或者更普遍地说,
n! = n*(n-1)!
现在我们可以继续下去,直到达到 0!
,即 1
。
下面提供了此的实现。
示例:R 中的递归函数
# Recursive function to find factorial
recursive.factorial <- function(x) {
if (x == 0) return (1)
else return (x * recursive.factorial(x-1))
}
在这里,我们有一个会调用自身的函数。例如 recursive.factorial(x)
将变为 x * recursive.factorial(x)
,直到 x
等于 0
。
当 x
等于 0
时,我们返回 1
,因为 0
的阶乘是 1
。这是终止条件,非常重要。
没有这个,递归将不会结束,并且(理论上)会无限进行下去。以下是我们函数的一些示例调用。
> recursive.factorial(0)
[1] 1
> recursive.factorial(5)
[1] 120
> recursive.factorial(7)
[1] 5040
递归的使用通常使代码更短,看起来更整洁。
然而,有时很难跟踪代码逻辑。可能很难以递归的方式思考问题。
递归函数也很占用内存,因为这可能导致大量的嵌套函数调用。在使用它解决大型问题时,必须牢记这一点。