我正在自學該書"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