2017-12-27 25 views
-1

MIT 계획 : 나는 피보나치 시리즈 (SICP의 섹션 1.2.2)의 n 번째 기간을 계산하는 함수를 작성했지만, 난 오류가 무엇입니까 : 지정되지 않은 반환 값을MIT 제도 : 지정되지 않은 반환 값 오류

(define (fib n) (
    define (fib-iter a b count) (
      if (= count n) a 
      (fib-iter b (+ a b) (+ count 1))) 
    (fib-iter 0 1 1)) 
) 

도움 주셔서 감사합니다.

+1

자신에게 호의적으로 "C 중괄호로 쓰기"습관을 들려주십시오. Lisps는 그 구조를 가지고 있지 않습니다. – molbdnilo

답변

1

도우미 기능 fib-iter에는 끝에는 닫기 대괄호가없고 fib에는 추가 닫는 대괄호가 없습니다. 결과적으로 라인 (fib-iter 0 1 1)fib-iter에 포함되고 fib은 실제로 평가 및 반환 할 표현식이 없으므로 결국 ... no expression in body ... 오류가 발생합니다. 여기

당신이 원하는 무엇인가 :

(define (fib n) 
    (define (fib-iter a b count) 
    (if (= count n) 
     a 
     (fib-iter b (+ a b) (+ count 1)))) ; 1 closing bracket added here 
    (fib-iter 0 1 1))       ; 1 closing bracket removed here 

당신은 괄호와 일치하는 몇 가지 편집기를 사용하여 혜택을 누릴 수 있습니다. 예를 들어, Racket 박사는 커서가 괄호를 열거 나 닫을 때 활성화되어 있으면 괄호 안에 포함 된 함수 본문을 강조 표시합니다.

+0

정말 고마워요! 내가 한 것은 (나에게) 구문 적 오류가 아니라 개념적 오류였습니다. 내가하고있는 일 : (fib-iter 정의와 fib-iter 정의) fib (name parameters)의 정의) 하지만 무엇을했는지는 (defintion of fib (name parameters) (정의 fib-iter) (fib-iter 호출)) – Apoorve

+0

사실 'fib-iter'는 단순히 도우미 함수에 불과합니다. 제대로 작성된 도우미 함수는 상위 함수에서 벗어날 수 있으며 둘 다 동일하게 작동해야합니다 (범위 만 다를 수 있음). 원래 버전에서'fib-iter'를'fib '밖으로 옮기고 싶다면'fib'를'(define (fib n))'으로 정의하고 평가/반환 할 본문 표현식이 없으므로 초기 오류. 아마도 헬퍼 함수를 ​​독자적으로 작성하면 각 구성 요소가하는 일을 더 개념화하는 데 도움이됩니다. – assefamaru

-2

잘못된 위치에 대괄호가 있습니다.

+1

죄송 합니다만 어디로 보내 주시겠습니까? – Apoorve