2013-06-23 1 views
2

저는 방금 오늘 스킴을 배우기 시작합니다.스킴 - 내 gcd()는 항상 0을 반환합니다.

나는 gcd() 함수를 작성했지만 항상 0을 반환합니다.

(define (gcd a b) 
    (cond (= b 0) 
     (a) 
    (else ((gcd b (modulo a b)))) 
    ) 
) 

왜 내가 잘못 되었나요?

+0

괄호 문제. 좋은 IDE와 들여 쓰기를 사용하면 이런 종류의 문제를 피할 수 있습니다. 지금은 내 대답을보고 잘못된 점을 확인하십시오. –

+0

gcd는 a> = b 인 경우에만 작동합니다. – carla

답변

8

이 문제를 해결해야합니다

(define (gcd a b) 
    (cond [(= b 0) a] 
     [else (gcd b (modulo a b))])) 

을 잘못 괄호 사이에 어떤 표현을 둘러싼하고, 일부 괄호가 cond 표현에서 누락되었다. 당신은 괄호 안에 뭔가를 서라운드 방식에서는, 당신은 통역을 이야기하고 (a) 말 것을

주의 사항 : a이 인수를 갖는 프로 시저가 내가 그것을 호출 할,이 여기에이 아니었다, a입니다 단지 숫자. 내 위의 코드와 같이

또한, 가독성을 위하여, 그것은하는 cond 표현에 조건을 각각 분리하는 대신 ()[]를 사용하는 것이 좋은 생각 -하지만 그들을 잊지 마세요, 그들은 필수이고 귀하의 코드에서 첫 번째 조건에서 그들을 잊어 버렸습니다.

3

다른 사람들은 실수가 무엇이고 무엇을해야하는지 설명했습니다.

코드가 실제로 실행되는 방법과 사용자가 보는 출력을 생성하는 이유를 고려하는 것도 도움이됩니다. 누락 된 괄호 때문에 cond의 첫 번째 사례는 (= b 0)입니다. 첫 번째 것은 (=) 조건으로 간주됩니다. #f을 제외한 스키마의 모든 내용이 true이므로 항상 true입니다. 사실이므로이 경우 평가됩니다. 특히, 괄호 안의 나머지는 암시 적으로 begin과 같이 평가할 (가능한 여러) 표현식으로 사용됩니다. 따라서 기본적으로 (begin b 0)을 평가합니다. 결과는 마지막 표현 0의 결과입니다.

관련 문제