문제

스키마에 자동 모임을 작성하는 동안 몇 가지 문제에 직면하고 있습니다.

해시 테이블을 생성하고 값이 이미 계산되어 있는지 확인하는 작동 메모 저 기능이 있습니다. 이전에 계산 된 경우 값을 반환합니다. 그렇지 않으면 함수를 호출합니다.

(define (memoizer fun)
  (let ((a-table (make-hash)))
    (λ(n)
      (define false-if-fail (λ() #f))
      (let ((return-val (hash-ref a-table n false-if-fail)))
        (if return-val
            return-val
            (begin
              (hash-set! a-table n (fun n))
              (hash-ref a-table n)))))))

이제 다음과 같은 Memoize-Wrapper 함수를 만들고 싶습니다.

(define (memoize-wrapper function)
  (set! function (memoizer function)))

그리고 Memoize-Wrapper로 기능을 정의하는 Def-Memo라는 매크로를 만들기를 바랍니다. 예를 들어. 매크로는 (Memoizer (Function-Name Arguments Body ...) 또는 이와 유사한 것으로 확장 할 수 있습니다.

할 수 있어야합니다.

(def-memo (factorial n)
  (cond
    ((= n 1) 1)
    (else (* n (factorial (- n 1))))))

정상적인 느린 대신 요인의 메모 화 된 버전을 만들어야합니다.

내 문제는

  1. Memoize-Wrapper가 제대로 작동하지 않으며 메모 화 된 기능이 아니라 원래 기능을 호출합니다.
  2. 매크로 내부에 정의를 작성하는 방법을 모르겠습니다. 가변적 인 lenght 인수와 가변 길이 본체를 얻을 수 있는지 어떻게해야합니까? 그런 다음 함수를 정의하고 메모 리자로 랩핑하려면 어떻게해야합니까?

정말 감사합니다.

도움이 되었습니까?

해결책

이것이 제가 PLT 체계에서 사용하는 것입니다.

#lang scheme

(define (memo f)
  (define mh (make-hash))
  (lambda p
    (hash-ref mh p (lambda ()
                     (hash-set! mh p (apply f p))
                     (hash-ref mh p)))))

(define-syntax-rule (defmemo (id . p) . body)
  (define id (memo (lambda p . body))))

(provide defmemo)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top