0

私はRに非常に慣れていないので、遊んでいます。与えられた 2 つの辺を持つ可能な Heron 三角形の数を計算するコードを書きました。私たちの多くが知っているように、ヘロンの三角形は面積だけでなく、整数としてすべての辺を持ちます。以下のコードでは、a & 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をプラグインすると、 として答えが得られます。コードを見ると、for ループと ifelse 部分に何らかの問題があることが明らかです。しかし、私はそれを理解することができないので、この質問です。前もって感謝します。a=5b=50

4

2 に答える 2

2

コードに2つの間違いがあります。

最初:このWikiページによると、数式が正しくありません。2(平方根)を忘れました。

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ループのない2番目のソリューション

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
于 2012-08-15T20:40:30.410 に答える
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
> 

いずれも整数ではありません。したがって、d0のままです。

forループも削除しました。代わりに、R のベクトル化された性質を使用して、この計算を行うことができます。ベクトルを と同じ長さにするために必要な回数だけaandを繰り返します。bareac

次に、次のようなものです。

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

ヘロンの三角形の数が表示されます。式をよく知っている他の誰かが、それが正しいかどうかを教えてくれるはずです.

于 2012-08-15T20:36:32.743 に答える