2015-10-23 68 views
0

我沒有編程背景(除了有R摔跤做事情),我試圖用語言表達R {numbers}包中更大公約數的公式是在每個步驟中嘗試去做的。我需要了解的步驟流程函數內的幫助:解讀[R]最大公約數(GCD)(和LCM)功能的{}數字包

function (n, m) 
{ 
    stopifnot(is.numeric(n), is.numeric(m)) 
    if (length(n) != 1 || floor(n) != ceiling(n) || length(m) != 
     1 || floor(m) != ceiling(m)) 
     stop("Arguments 'n', 'm' must be integer scalars.") 
    if (n == 0 && m == 0) 
     return(0) 
    n <- abs(n) 
    m <- abs(m) 
    if (m > n) { 
     t <- n 
     n <- m 
     m <- t 
    } 
    while (m > 0) { 
     t <- n 
     n <- m 
     m <- t%%m 
    } 
    return(n) 
} 
<environment: namespace:numbers> 

例如,在if (m > n) {}部分n變得t,並最終成爲m?我不敢問,因爲這可能很明顯,但我不知道發生了什麼。同樣適用於,我猜他else等式的一部分可能是%%也可能是模。

+1

對於具體的「如果」你問,這部分掉期「m」與「n」通過創建一個臨時變量(「t」)。你可以使用'?debug'('debug(GCD)'),然後調用函數'GCD(x,y)'來查看函數正在做什麼,並查看所有中間變量的值。函數的信息可以像'help(「%%」)等一樣訪問。 –

回答

1

什麼它說的是:

停止,如果m或n的不是數字,多個號碼,或有小數,並返回消息,「參數‘N’,‘M’必須是整數標量「。

如果它們都爲零,則返回零。

從現在開始使用絕對值。

做,因爲我們最終會在申請下一步的算法確保N> M。如果不是這種情況,請將它們翻轉:最初將n放在臨時變量「t」中,並將m指定給n,以便現在較大的數字位於(n,m)表達式的開頭。此時,初始(n,m)值都包含m。通過檢索臨時變量中的值並將其分配給m來完成它。

現在他們應用修改後的Euclidean algorithm來找到GCD--這是一種更快捷的多重減法算法的更有效版本,取而代之的是兩個數字中的較大者除以其中較小者的餘數。

在算法最終會被一次迭代後的大年初的數量較少,因此我們將其分配到n來準備第二次迭代。儘管如此,我們需要通過將當前n賦值給臨時變量t來獲取當前的n值。在此之後,我們得到將現在存儲在t中的原始較大數字(n)除以較小數字m得到的模數。結果將取代以m存儲的數字。

只要有一個餘數的進程將繼續下去,這一次與初始數量較少,米打這個大傢伙的作用。當沒有餘數時,返回該特定迭代中較小的數字。

附錄:

現在,我知道怎麼讀這個功能,我看到它僅限於在輸入功能的兩個數字。所以,我自己招待組建一個功能,可以用三個整數輸入工作:

require(numbers) 

GCF <- function(x,y,z){ 
    tab.x <- tabulate(primeFactors(x)) 
    tab.y <- tabulate(primeFactors(y)) 
    tab.z <- tabulate(primeFactors(z)) 

    max.len <- max(length(tab.x), length(tab.y), length(tab.z)) 
    tab_x = c(tab.x, rep(0, max.len - length(tab.x))) 
    tab_y = c(tab.y, rep(0, max.len - length(tab.y))) 
    tab_z = c(tab.z, rep(0, max.len - length(tab.z))) 

    GCD_elem <- numeric() 
    for(i in 1:max.len){ 
     GCD_elem[i] <- min(tab_x[i], tab_y[i], tab_z[i]) * i 
    } 
    GCD_elem <- GCD_elem[!GCD_elem==0] 
    GrCD <- prod(GCD_elem) 
    print(GrCD) 
} 

還在爲LCM:

LCM <- function(x,y,z){ 
    tab.x <- tabulate(primeFactors(x)) 
    tab.y <- tabulate(primeFactors(y)) 
    tab.z <- tabulate(primeFactors(z)) 

    max.len <- max(length(tab.x), length(tab.y), length(tab.z)) 
    tab_x = c(tab.x, rep(0, max.len - length(tab.x))) 
    tab_y = c(tab.y, rep(0, max.len - length(tab.y))) 
    tab_z = c(tab.z, rep(0, max.len - length(tab.z))) 

    LCM_elem <- numeric() 
    for(i in 1:max.len){ 
     LCM_elem[i] <- i^(max(tab_x[i], tab_y[i], tab_z[i])) 
    } 
    LCM_elem <- LCM_elem[!LCM_elem==0] 
    LCM <- prod(LCM_elem) 
    print(LCM) 
}