2013-01-19 53 views
1

我正在研究一個函數,該函數需要一個結構列表,然後使用該結構列表產生一個函數,將一個符號列表處理爲一個數字。每個結構都由一個符號組成,這個符號將在第二個列表中被使用,並且是一個數字。生成的這個函數必須通過爲每個符號分配一個基於先前結構的值來將符號列表變成一個數字。使用抽象列表函數btw。創建一個函數,生成一個函數方案/ DrRacket

Example: ((function (list (make-value 'value1 10) (make-value 'value2 20))) 
       (list 'value1 'value2 'nothing 'value1)) would produced 40. 

繼承人我的代碼,但它只適用於特定情況。

(define (function lst) 
    (lambda (x) (foldr + 0 (map (lambda (x) 
          (cond 
          [(equal? x (value-name(first lst)))(value-value (first lst))] 
          [else (value-value (second lst))])) 

          (filter (lambda (x) (member? x (map value-name lst)))x))))) 

回答

0

看起來像一個家庭作業。你的解決方案的基本形狀是可以的。我認爲你在這裏遇到問題的原因是你的代碼沒有分解,所以在括號中很容易丟失。

讓我們從fold的想法開始,+作爲最後一步的計算。

對於這個子任務,你必須:

1)的(名稱,值)對 2)名稱

列表的服務,您需要獲得值的列表。編寫一個獨立的函數,完成並使用它。像這樣

(define (function lst) 
    (lambda (x) (foldr + 
         0 
         (to-values x lst))) 

(define (to-values names names-to-values) 
    (map (lambda (name) 
      (to-value name names-to-values)))) 

(define (to-value n ns-to-vs) 
    ...) 

在這裏,我們有另一個小功能mapnames。它會查找ns-to-vs中的n值,並返回它或0,如果沒有人。

+0

如何編寫最後一個函數,我仍然遇到我的同一問題 – user1992460

+0

提示:https://www.google.com/search?q=racket+findf – hoha

+0

無法使用findf – user1992460

0

有兩種解決foldr問題的方法,研究和理解這兩種方法會很有趣。第一個嘗試在問題中,首先是生成一個包含所有值的列表,並讓foldr負責添加它們。它能夠以更簡單的方式來實現這樣的:

(define (function lst) 
    (lambda (x) 
    (foldr + 
      0 
      (map (lambda (e) 
        (cond ((assoc e lst) => value-value) 
         (else 0))) 
       x)))) 

或者:也許使用foldr是矯枉過正,應用+簡單:

(define (function lst) 
    (lambda (x) 
    (apply + 
      (map (lambda (e) 
        (cond ((assoc e lst) => value-value) 
         (else 0))) 
       x)))) 

在我們把輸入列表「因爲是第二種方法「並讓foldrlambda執行加法邏輯。這比使用foldr第一種方法更有效,因爲沒有必要創建一箇中間表 - 一個在第一個版本由map產生:

(define (function lst) 
    (lambda (x) 
    (foldr (lambda (e a) 
      (cond ((assoc e lst) => (lambda (p) (+ a (value-value p)))) 
        (else a))) 
      0 
      x))) 

在這兩種方法我使用assoc尋找元素在列表中;如果不允許使用它,或者它不適用於使用make-valueassoc創建的值,它將很容易實現爲幫助器函數,它會獲取名稱 - 值對列表並返回具有給定名稱的第一個對。 語法condassoc返回的對傳遞給lambda的參數並執行它。

而且由於你使用的球拍,還有的語法糖位,可用於從另一個函數返回一個函數,試試這個等效的代碼,爲了簡單起見:

(define ((function lst) x) 
    (foldr + 
     0 
     (map (lambda (e) 
       (cond ((assoc e lst) => value-value) 
         (else 0))) 
       x))) 

還是這個:

(define ((function lst) x) 
    (foldr (lambda (e a) 
      (cond ((assoc e lst) => (lambda (p) (+ a (value-value p)))) 
       (else a))) 
     0 
     x)) 

無論如何,如預期的結果:

((function (list (make-value 'value1 10) (make-value 'value2 20))) 
(list 'value1 'value2 'nothing 'value1)) 
=> 40 
相關問題