2012-08-15 109 views
0

我對R很新,只是在玩它。我寫了一些代碼來計算雙方給出的可能的蒼鷺三角形的數量。正如我們許多人所知道的,蒼鷺三角形的所有邊和整個區域都是整數。在下面給出的代碼中,&b是整數。ifelse&for循環R-幫助需要一個簡單的例子

heron <- function(a,b) 
{ 
    d = 0 
    for(c in abs(a-b)+1:a+b-1) 
    { 
    area <- ((1/4)*sqrt((a^2+b^2+c^2)^2-(a^4+b^4+c^4))) 
    d <- ifelse(area == floor(area), d+1, d) 
    } 

    return(d) 
} 

該代碼返回錯誤的值。例如,heron(5,5)=2但是當我插入a=5,b=5時,它給出的答案代碼爲0。查看代碼,很明顯,for循環和ifelse部分存在一些問題;但我無法弄清楚,所以這個問題。提前致謝。

+1

'ABS(AB)+1:A + b-1'是不是你認爲它是。序列運算符「:」優先。 – 2012-08-15 20:40:51

+0

現在明白了。謝謝! – user156934 2012-08-15 21:07:41

回答

1

你正在運行我假設的浮點數學錯誤。如果你走徹底的計算:

a <- 5 
b <- 5 

c我可以從你for loop代碼蒐集,但它不是做你認爲:

abs(a-b)+1:a+b-1 

至9 abs(a-b)+ (1 through a+b) - 1給出了數字5。而不是(abs(a-b) + 1) through (a + b - 1)

c <- 1:9 

area <- 1/4 * sqrt((a^2 + b^2 + c^2)^2 - (a^4 + b^4 + c^4)) 

> area 
[1] 9.185587 10.155048 11.592023 13.346348 15.309311 17.410485 19.605484 21.866070 24.173850 
> 

其中沒有一個是整數。因此,d停留在0.

我也放棄了for循環。您可以使用R的向量化特性來進行此計算。它重複ab所需的次數以使area載體的長度與c的長度相同。

然後是這樣的:

length(area[area==floor(area)]) 

會給你鷺三角形的數量。其他更瞭解該公式的人必須告訴你其是否正確。

+0

我建議'for'循環看起來有點rope::'for(c in abs(ab)+1:a + b-1)''我知道你已經把它放在你的解決方案中,但它是值得的明確指出。 – csgillespie 2012-08-15 20:39:05

+0

@csgillespie謝謝我忘了那件作品了。 – Justin 2012-08-15 20:41:20

+0

非常感謝,我再次檢查了公式,發現我在公式中犯了一個錯誤:(抱歉沒有注意細節,現在代碼運行正常,所以我要求刪除該問題。 – user156934 2012-08-15 20:43:44

2

我在代碼中看到兩個錯誤。

第一:根據本Wiki Page公式是不正確的,你忘了2(在平方根)

二:在for循環中,你必須添加一些額外的支架(在讀10 + 1:12 != 11:12

heron <- function(a,b) 
{ 
    d = 0 
    for(c in (abs(a-b)+1):(a+b-1)) 
    { 
    area <- ((1/4) * sqrt((a^2+b^2+c^2)^2 - 2 * (a^4+b^4+c^4))) 
    d <- ifelse(area == floor(area), d+1, d) 
    } 

    return(d) 
} 

heron(5, 5) 
[1] 2 
heron(13, 25) 
[1] 0 

沒有第二個解決方案循環

Heron <- function(a, b) { 
C <- (abs(a-b)+1):(a+b-1) 
Res <- sapply(C, function(i) 
        ((1/4) * sqrt((a^2+b^2+i^2)^2 - 2 * (a^4+b^4+i^4)))) 
length(Res[Res == floor(Res)]) 
} 
Heron(5, 5) 
[1] 2 
Heron(13, 25) 
[1] 0 
+0

對不起。但是,即使使用正確的版本,代碼也會爲某些值生成NAs,例如, a = 13,b = 25。我無法理解爲什麼? – user156934 2012-08-15 20:48:53

+0

@ user156934:在for循環中添加額外的括號.... Csgillespie和Joshua Ulrich上面的評論中也指出了這個錯誤 – dickoa 2012-08-15 21:00:33

+0

非常感謝您的耐心等待。我現在明白了錯誤。再次感謝!! – user156934 2012-08-15 21:06:36