使用racket对排列列表中的嵌套列表进行递归求和

使用racket对排列列表中的嵌套列表进行递归求和,racket,Racket,我有一张号码表和一张球拍操作员的名单 (define numList (list 5 25)) (define ops '(+ *)) 我正在使用笛卡尔积将运算符与数字列表的每个可能排列联接起来 (cartesian-product ops (permutations numList)) 它给出了以下结果 '((+ (5 25)) (+ (25 5)) (* (5 25)) (* (25 5))) 我想对每个嵌套列表求和,即(+(5 25)),然后将它们添加到列表中。 到目前为

我有一张号码表和一张球拍操作员的名单

(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)))))

eval
有点过分了。相反,您可以通过比较符号相等性来确定所需的过程。因为racket有一流的程序,所以您只需返回程序本身。例如:

(define (get-procedure term)
  (case term
    [(+) +]
    [(-) -]
    [(*) *]
    [(/) /]))
如果您不知道
案例
,可以使用
cond
表单

(cond [(eq? term '+) +] ...
然后您可以将其与
apply
一起使用,如中所示

(define (evaluate term)
  (define procedure (get-procedure (first term)))
  (define arguments (second term))
  (apply procedure arguments))
然后您可以
映射
过程
评估
,如中所示

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

这将为您提供一个数字列表。在你给出的四个元素的列表中,你会得到
”(30 30 125)
,我相信这就是你想要的。

非常感谢你的时间和努力,太完美了。不幸的是,我没有足够的声誉来投票支持你,但让我们说它是a+1!