2017-04-22 48 views
2

我有一個數字列表和一個球拍中的運算符列表。使用球拍在排列列表中遞歸地求和嵌套列表

(define numList (list 5 25)) 
(define ops '(+ *)) 

我使用笛卡爾積加入運營商的號碼列表中的每個可能的排列。

(cartesian-product ops (permutations numList)) 

它給出以下結果;

'((+ (5 25)) 
    (+ (25 5)) 
    (* (5 25)) 
    (* (25 5))) 

我要總結每個嵌套列表,即(+(5月25日)),然後將它們添加到列表中。 我已設法使用eval關鍵字到目前爲止執行以下操作:

(define ns (make-base-namespace)) 

(list (eval 
    (flatten 
    (cadr 
    (cartesian-product ops (permutations numList))))ns)) 

從而消除每個列表的嵌套和對第一3種元素的總和,並返回50(+(5 25))的值。 我想在執行拼合之前在每個嵌套節上遞歸執行此操作。我知道我也可以使用移除副本。 我是新來的球拍,但這是我到目前爲止;

(define (evalCart l) 
(if (null? l) 
    0 
    (list 
    (eval 
    (flatten 
    (cadr 
     (cartesian-product ops (permutations numList)))) ns) (evalCart (car 
l))))) 

回答

3

eval是有點矯枉過正。您可以通過比較符號相等來確定您想要的過程。由於球拍有一等程序,你可以直接返回程序本身。例如:

(define (get-procedure term) 
    (case term 
    [(+) +] 
    [(-) -] 
    [(*) *] 
    [(/) /])) 

如果你不知道case可以使用cond形式

(cond [(eq? term '+) +] ... 

然後你可以用apply使用本作中

(define (evaluate term) 
    (define procedure (get-procedure (first term))) 
    (define arguments (second term)) 
    (apply procedure arguments)) 

然後你可以map程序evaluate

(map evaluate (cartesian-product ops (permutations numList))) 

這會給你一個數字列表。在你給出的四個元素列表的情況下,你會得到'(30 30 125 125),我相信這是你正在尋找的東西。

+0

非常感謝您的時間和精力,這非常完美。不幸的是我沒有足夠的聲望來投票給你,但我們只是說它是+1! – morpheus1977