2016-04-19 22 views
0

我已經分配了家庭作業來制定計劃中的一般記憶過程,到目前爲止,它對採用一個參數的過程起作用,但是對於提供超過1個參數時似乎是最後一個參數的失敗。它也沒有記錄不採取任何論據的程序。計劃中的一般記憶

任何幫助將不勝感激。

(define mem 
    (lambda (mem-it func) 
    (let ((table (make-table))(func-store func)) 
     (cond 
     ((equal? mem-it 'memoize)   
     (lambda args 
      (if (null? args) 
       func 
       (let ((prev (lookup args table))) 
       (or prev 
        (let ((result (apply func args))) 
         (insert! args result table) 
         result)))))) 

     ((equal? mem-it 'unmemoize) 
     (func-store)) 

     (else (display "No Such command")))))) 

這是我迄今爲止

(define (test-proc . args) 
    (display "computing test-proc of ") 
    (display args) 
    (newline) 
    (if (null? args) 
     0 
     (+ (expt (- 42 (car args)) 2) 
     (apply test-proc (cdr args))))) 

這裏是測試程序提供

當我嘗試運行下面的測試

(set! test-proc (mem 'memoize test-proc)) 
(test-proc 40 41 42 43 44) 
出現的錯誤

以下是使用的其他程序

(define (make-table) 
    (list '*table*)) 

    (define (lookup key table) 
    (let ((record (assoc key (cdr table)))) 
     (and record (cdr record)))) 

(define (insert! key value table) 
    (let ((record (assoc key (cdr table)))) 
    (if record 
     (set-cdr! record value) 
     (set-cdr! table 
        (cons (cons key value) (cdr table)))))) 
+1

由於縮進關閉,您的代碼不可讀。你爲什麼不使用編輯器來爲你做這個? – Sylwester

+0

希望現在看起來更好 – Cezar

+0

你的問題到底是什麼?您是否試圖記憶多個參數的函數,或者您是否試圖將一個參數的memoized函數應用於值列表? –

回答

1

你memoizarion程序有一個特點,它返回時沒有傳遞參數的實現過程:

((mem 'memoize test-proc)) ; ==> test-proc 

測試過程的基本情況永遠不會打,因爲這個功能從而爲(test-proc 1)你可以將其替換爲表達(+ 1681 test-proc),由於test-proc不是一個數字,這將表示錯誤。

這是更好地使用神奇獨特的價值觀:

(define +GET-PROC+ (list "get-proc")) 
(test-proc +GET-PROC+) ; ==> original-test-proc 

因爲我們正在做一個列表它是eq?只是數據。在R6RS中,您可以避免導出,以便使用記憶的代碼實際上不會有混亂的情況。所有看起來像它的列表,例如("get-proc")將不會是eq?,因此它可以用作參數而不需要獲取原始過程。

既然你不使用標準的哈希程序從(rnrs hashtables)SRFI-69它不可能爲我檢查,但由於您使用的名單,作爲關鍵的哈希表必須使用equal?作爲測試。在大多數Lisp中使用哈希表時,這通常是令人沮喪的來源。

+0

我已經添加了你詢問的程序,希望它有幫助 – Cezar

+0

@Cezar'assoc'確實使用'equal?',但是它比使用我在我的答案中提到的一個哈希表實現要慢。因此,你唯一的問題是你沒有使用參數作爲amagic值,你試圖記憶的過程也不使用參數作爲基本情況。 – Sylwester