我有一个数字列表和一个操作员列表。
(define numList (list 5 25))
(define ops '(+ *))
我正在使用 cartesian-product 将运营商加入到数字列表的每个可能的排列中。
(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))。 我想在执行展平之前在每个嵌套部分上递归执行此操作。我知道我也可以使用删除重复。 我是Racket的新手,但这是我到目前为止所拥有的;
(define (evalCart l)
(if (null? l)
0
(list
(eval
(flatten
(cadr
(cartesian-product ops (permutations numList)))) ns ) (evalCart (car
l)))))
答案 0 :(得分: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)
,我相信这是您正在寻找的。 p>