我有一个号码列表和一个运营商名单在球拍。
(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 (+ (525))。在执行扁平化之前,我希望在每个嵌套部分上递归地执行此操作。我知道我也能使用remove-duplicates。我刚接触过球拍,但到目前为止,我的情况是这样的;
(define (evalCart l)
(if (null? l)
0
(list
(eval
(flatten
(cadr
(cartesian-product ops (permutations numList)))) ns ) (evalCart (car
l)))))
发布于 2017-04-23 00:46:32
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)
,我相信这就是您要寻找的。
https://stackoverflow.com/questions/43565510
复制相似问题