ifelse&一个简单的例子需要R- help中的for循环

时间:2012-08-15 20:26:02

标签: r

我对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=5b=5时,代码会将答案显示为0。看一下代码,很明显for循环和ifelse部分存在一些问题;但我无法弄清楚,因此这个问题。提前谢谢。

2 个答案:

答案 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的矢量化特性来进行此计算。它会根据需要重复ab次,以使area向量与c的长度相同。

然后像:

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

会给你苍鹭三角形的数量。其他更了解公式的人必须告诉你它是否正确。