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中的递归对于查找自重复序列的总和最有用。在这个例子中,我们将找到给定数字序列的平方和。
总和 = 1 2 +2 2 +…+N 2
例子:
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) 或分治算法。
- 在动态编程中,对于自上而下和自下而上的方法,递归对于性能至关重要。
- 在分而治之的算法中,我们将一个问题分成更容易解决的更小的子问题。然后将输出重新构建到顶部。递归有一个类似的过程,这就是为什么它被用来实现这样的算法。
- 本质上,递归是将一个问题分解成许多更小的问题的过程,这些更小的问题被进一步分解,直到剩下的问题变得微不足道。然后逐步构建解决方案。