2017-11-20 7 views
0

저는 Scheme에 초보자입니다. 그러나 작성하려고하는 것은 매우 간단합니다. 내가하려고 할 때스키마 : 오류 : # <undef>은 (는) 함수가 아닙니다.

(define (expt x n) 
    (cond ((= n 0) 1) 
     ((= n 1) x) 
     ((= n -1) (/ 1 x)) 
     ((< n 0) (* (/ 1 x) (expt x (+ n 1)))) 
     (else (* x (expt x (- n 1))))) 

기능 expt 제대로 작동하려면 보이지만 : 바로 그겁니다, 내가 부족 뭔가가 ... 나는 다음과 같은 정의가 있습니다

(define (fast-expt x n) 
    (if (even? n) 
     (expt (expt x (/ n 2)) 2) 
     (expt x n))) 

을 그리고 그것은 내 이전 함수를 사용하여 fast-expt을 테스트하면 다음과 같이 표시됩니다. Error: #<undef> is not a function [fast-expt]. 중요한 점은 온라인 컴파일러를 사용하는 것입니다. https://repl.it

답변

1

works for me 그러나 expt에는 닫는 괄호가 없습니다. 온라인 통역관에서 fast-expt 전에 expt을 정의해야 할 수 있습니다. 또는 더 나은 방법은 Racket과 같은 좋은 오프라인 통역사로 전환하는 것입니다.

fast-expt에 대한 구현은 자체 호출해야합니다. 그렇지 않으면 첫 번째 짝수 지수에만 적용되고 그 시점부터는 "느린"expt이 사용됩니다. 이것은 다음과 같이 구현되어야합니다 :

+0

예,'fast-expt' 전에는'expt'를 정의했지만 여전히 저에게는 효과가 없습니다. 코드를 복사하여 붙여 넣을 때도 그렇게 혼동하지 않습니다. DrRacket 편집기에서 설치하고 시도해 보겠습니다. 아마도 repl.it 컴파일러에 들어있을 것입니다. 그리고'fast-expt' 함수를 개선 해줘서 고맙습니다. :) – barni

+0

@barni 닫는 괄호가 누락되었습니다. 업데이트 된 답변을 참조하십시오. 그리고 난 [repl.it] (https://repl.it/repls/HarmoniousBlueLeafbird)에서 테스트했습니다. 제대로 작동합니다. –

+0

그래, DrRacket에서 코드를 실행하면 나도 똑같이 던져 버린다. 단지 괄호 만 쓰면 .. 어리석은 실수 야! 대단히 감사합니다 :) – barni