我对R很新,只是玩它。我写了一些代码来计算可能的Heron三角形的数量,给出了两边。正如我们许多人所知,苍鹭三角形的所有边都是整数和区域。在下面给出的代码中,& b是整数。
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部分存在一些问题;但我无法弄清楚,因此这个问题。提前谢谢。
答案 0 :(得分:2)
我在你的代码中看到两个错误。
首先:根据这个Wiki Page你的公式不正确你忘记了2(在平方根中)
第二:在for循环中,你必须添加一些额外的括号(在R 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
没有for循环的第二个解决方案
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
答案 1 :(得分:1)
我假设你遇到浮点数学错误。如果你走完了计算:
a <- 5
b <- 5
c
我可以从您的for loop
代码中收集,但它没有按照您的想法行事:
abs(a-b)+1:a+b-1
给出数字5到9. abs(a-b)+ (1 through a+b) - 1
。而不是(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的矢量化特性来进行此计算。它会根据需要重复a
和b
次,以使area
向量与c
的长度相同。
然后像:
length(area[area==floor(area)])
会给你苍鹭三角形的数量。其他更了解公式的人必须告诉你它是否正确。