2012-08-15 107 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