我正在自学该书"Introduction to Algorithms" by Cormen et alli.在他们的书中,他们使用的假代码假设数组是通过指针传递的(通过引用)。这不同于R(对象是按值传递的),所以我在尝试尽可能地转换它们的伪代码时遇到了一些困难,特别是在涉及递归时。大多数情况下,我必须以不同的方式实施。例如,使用合并排序算法,他们定义合并函数(我认为我已经正确翻译了)和递归MergeSort函数(其中直接翻译为R不起作用)。合并排序R
在伪码合并功能如下,其中:A是一个数组且p,q和r为索引到所述阵列使得P < q <河该过程假定子阵列A [p:q]和A [q + 1:r]按排序顺序排列。它融合了它们形成一个子数组排序代替现有的子阵列[P:R]
Merge(A, p, q, r)
n1 = q - p + 1
n2 = r - q
let L[1...n1+1] and R[1...n2+1] be new arrays
for i = 1 to n1
L[i] = A[p+i-1]
for j = 1 to n2
R[j] = A[q+j]
L[n1+1] = infinite
R[n2+1] = infinite
i=1
j=1
for k = p to r
if L[i] <= R[j]
A[j] = L[i]
i = i + 1
else
A[k] = R[j]
j = j + 1
我已经翻译成R作为:
Merge <- function(a, p, q, r){
n1 <- q - p + 1
n2 <- r - q
L <- numeric(n1+1)
R <- numeric(n2+1)
for(i in 1:n1){
L[i] <- a[p+i-1]
}
for(j in 1:n2){
R[j] <- a[q+j]
}
L[n1+1] <- Inf
R[n2+1] <- Inf
i=1
j=1
for(k in p:r){
if(L[i] <= R[j]){
a[k] <- L[i]
i <- i +1
}else{
a[k] <- R[j]
j <- j+1
}
}
a
}
它似乎很好地工作。现在
Merge(c(1,3,5, 2,4,6), 1, 3, 6)
[1] 1 2 3 4 5 6
的归并函数在伪代码定义如下:
MergeSort(A, p, r)
if p < r
q = (p+r)/2
MergeSort(A, p, q)
MergeSort(A, q+1, r)
Merge(A, p, q, r)
这假定A被参考,并且每一个变化是每递归调用,这是不正确的可见传递在R.
所以,鉴于上述定义的Merge
功能,你将如何实现在R上的MergeSort
功能,以获得正确的结果? (如果可能是,并且优选但不是必要的,有点类似于伪代码)
尝试ENVIR = .GlobalEnv – rnso 2014-09-28 01:49:46
ENVIR = .GlobalEnv会让你的变量在每一个递归调用可见。但是,我不确定如何在问题中使用它。看到这个和搜索其他的例子:http://stackoverflow.com/questions/22412620/define-global-variable-using-function-argument-in-r – rnso 2014-09-28 02:23:28