2012-08-15 2 views
0

저는 R에 매우 익숙합니다. 주어진 두면을 가진 가능한 헤론 삼각형의 수를 계산하는 코드를 작성했습니다. 우리 중 많은 사람들이 알고 있듯이, 헤론 삼각형은 정수면뿐만 아니라 그면을 모두 가지고 있습니다. 아래 주어진 코드에서 & b는 정수입니다.ifelse & for for loop in 간단한 예제가 필요합니다

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

'복근 (AB) +1 : A + B-1 '당신이 생각하는 것이 아니다. 시퀀스 연산자':'가 우선권을가집니다. –

+0

이제 알겠습니다. 감사! – user156934

답변

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의 벡터화 된 특성을 사용하여이 계산을 대신 수행 할 수 있습니다. area 벡터를 c과 동일한 길이로 만들기 위해 필요한만큼 반복하여 ab을 반복합니다.

는 그런 일이 같은 :

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

당신에게 헤론 삼각형의 수를 줄 것이다. 수식을 더 잘 알고있는 사람은 올바른지 여부를 알려야합니다.

+0

나는'for' 루프가 약간의 ropey처럼 보일 것이라고 제안 할 것이다.'for (abs (ab) +1 : a + b-1)'나는 당신이 당신의 솔루션에 그것을 떨어 뜨렸다는 것을 알고 있지만, 명시 적으로 지적했다. – csgillespie

+0

@csgillespie 감사합니다. 편집 한 것을 잊어 버렸습니다. – Justin

+0

감사합니다. 수식을 다시 확인한 결과 수식에 실수를 한 것으로 나타났습니다. (세부 사항에 신경 쓰지 않아서 죄송합니다. 이제 코드가 제대로 실행되므로 질문을 삭제하도록 요청하십시오. – user156934

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 
Wiki Page 수식을 따라하면 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 
+0

죄송합니다. 그러나 올바른 버전을 사용하더라도 코드는 일부 값에 대해 NAs를 생성합니다. a = 13, b = 25이다. 나는 이유를 이해할 수 없었다? – user156934

+0

@ user156934 : for 루프에 여분의 브래킷을 추가하십시오 ... 오류는 위의 Csgillespie 및 Joshua Ulrich의 의견에서도 지적되었습니다 – dickoa

+0

양해 해 주셔서 감사합니다. 나는 이제 실수를 이해했다. 다시 한 번 감사드립니다! – user156934