使用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!