1.P120薛书
area <- function(f, a, b, eps = 1.0e-06, lim = 10) {fun1 <- function(f, a, b, fa, fb, a0, eps, lim, fun) {
d=(a+b)/2;fd=f(d);h=(b-a)/4;
a1=h*(fa+fd);a2=h*(fb+fd);
if(abs(a0-a1-a2)<eps||lim==0)
return(a1+a2)
else{
return(fun(f,a,d,fa,fd,a0,eps,lim-1,fun)+fun(f,d,b,fd,fb,a0,eps,lim-1,fun))
}
}
fa=f(a);fb=f(b);a0 <- ((fa + fb) * (b - a))/2;
return(fun1(f, a, b, fa, fb, a0, eps, lim, fun1))
}
f <- function(x) 1/x
quad<-area(f,1,5); quad
#一般来说,递归主要包括边界条件、递归前进段和递归返回段。递归调用时
,若边界条件不满足,递归前进;若边界条件满足时,则递归返回。
我这么说你可能还不太明白,我举个栗子
,比如1,2,3,...,n的自然数求和问题。我以f(n)来表示前n项的和,
容易知道f(n)=n+f(n-1),f(n-1)=n-1+f(n-2),...,f(3)=3+f(2),f(2)=2+f(1),f(1)=1。
于是我们可以定义如下递归函数:
mysum <- function(x){
if(x==1){
res = 1 #设置边界条件
} else {
res <- x + mysum(x-1) # 递归
}
return(res) # 返回
}
mysum(100)