使用racket以递归方式对排列列表中的嵌套列表求和

时间:2017-04-22 22:56:58

标签: racket

我有一个数字列表和一个操作员列表。

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

1 个答案:

答案 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),我相信这是您正在寻找的。