R语言 递归函数
递归,用最简单的话说,是一种循环技术。它利用了R语言中函数的基本工作原理。递归是指函数调用自己。这就形成了一个循环,每次函数被调用时,它就一次又一次地调用自己,这种技术被称为递归。由于循环会增加内存,所以我们使用递归。递归函数使用递归的概念来执行迭代任务,它们一次又一次地调用自己,这就像一个循环。这类函数需要一个停止条件,以便它们能够连续停止循环。
递归函数调用自己。它们将问题分解成更小的组成部分。函数()在原函数()内对每个较小的组件进行自我调用。在这之后,结果将被放在一起,以解决原来的问题。
例子:在R中使用递归的阶乘
rec_fac <- function(x){
if(x==0 || x==1)
{
return(1)
}
else
{
return(x*rec_fac(x-1))
}
}
输出
[1] 120
这里,rec_fac(5)调用rec_fac(4),然后调用rec_fac(3),依次类推,直到输入参数x,达到1,函数返回1并被销毁。返回值与参数值相乘后返回。这个过程一直持续到第一个函数调用返回其输出,给我们带来最终的结果。
例子。使用递归的数列之和
R中的递归对于寻找自我重复的数列之和最为有用。在这个例子中,我们将找出一个给定的数列的平方之和。
总和 = 12 +22 +…+N2
例子
sum_series <- function(vec){
if(length(vec)<=1)
{
return(vec^2)
}
else
{
return(vec[1]^2+sum_series(vec[-1]))
}
}
series <- c(1:10)
sum_series(series)
输出
[1] 385
R递归的主要特点
- 递归的使用,往往使代码更短,而且看起来很干净。
- 它是少数情况下的一个简单解决方案。
- 它在一个函数中表达了对自身的调用。
递归在R中的应用
- 递归函数被用于许多高效的编程技术中,如动态编程语言(DSL)或分割与征服算法。
- 在动态编程中,无论是自上而下还是自下而上的方法,递归都对性能至关重要。
- 在划分和征服算法中,我们将一个问题划分为更小的子问题,更容易解决。然后再把输出的结果回升到顶层。递归有一个类似的过程,这就是为什么它被用来实现这种算法。
- 就其本质而言,递归是将一个问题分解成许多更小的问题,这些更小的问题被进一步分解,直到剩下的问题是微不足道的。然后,解决方案又被一块一块地建立起来。