首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用racket在排列列表中递归地求和嵌套列表

使用racket在排列列表中递归地求和嵌套列表
EN

Stack Overflow用户
提问于 2017-04-22 22:56:57
回答 1查看 399关注 0票数 2

我有一个号码列表和一个运营商名单在球拍。

代码语言:javascript
运行
复制
(define numList (list 5 25))
(define ops '(+ *))

我使用cartesian-product将运算符加入到每个可能排列的数字列表中。

代码语言:javascript
运行
复制
(cartesian-product ops (permutations numList))

其结果如下:

代码语言:javascript
运行
复制
'((+ (5 25))
  (+ (25 5))
  (* (5 25))
  (* (25 5)))

我想把每个嵌套列表(+ (5,25))加在一起,然后把它们加到一个列表中。到目前为止,我已经使用eval关键字成功地完成了以下工作;

代码语言:javascript
运行
复制
(define ns (make-base-namespace))

(list (eval
   (flatten
    (cadr
     (cartesian-product ops (permutations numList))))ns ))

它移除每个列表的嵌套,并对前3个元素执行和,并返回值50 (+ (525))。在执行扁平化之前,我希望在每个嵌套部分上递归地执行此操作。我知道我也能使用remove-duplicates。我刚接触过球拍,但到目前为止,我的情况是这样的;

代码语言:javascript
运行
复制
(define (evalCart l)
(if (null? l)
  0
  (list
   (eval
    (flatten
     (cadr
      (cartesian-product ops (permutations numList)))) ns ) (evalCart (car 
l)))))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-23 00:46:32

eval有点过火了。相反,您可以通过比较符号相等来确定您想要的过程。因为球拍有一流的程序,你可以只返回程序本身。例如:

代码语言:javascript
运行
复制
(define (get-procedure term)
  (case term
    [(+) +]
    [(-) -]
    [(*) *]
    [(/) /]))

如果您不知道case,可以使用cond表单

代码语言:javascript
运行
复制
(cond [(eq? term '+) +] ...

然后,您可以将它与apply一起使用,如

代码语言:javascript
运行
复制
(define (evaluate term)
  (define procedure (get-procedure (first term)))
  (define arguments (second term))
  (apply procedure arguments))

然后,您可以将过程map evaluate如下所示

代码语言:javascript
运行
复制
(map evaluate (cartesian-product ops (permutations numList)))

这会给你一个号码列表。在您给出的四个元素列表中,您将得到'(30 30 125 125),我相信这就是您要寻找的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43565510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档