【问题标题】:Powerset of a list using abstract list functions使用抽象列表函数的列表的幂集
【发布时间】:2021-03-07 02:14:57
【问题描述】:

是否有可能制作一个球拍函数来返回给定列表的 powerset


约束-

  1. 没有显式递归
  2. 使用抽象列表函数
  3. 两行代码(实际要求)

例如: (powerset '(1 2))

'((1 2) (1) (2) ())

按任意顺序。

我发现的另一个question 仍然使用显式递归。


我的工作流程:

  1. (powerset '(a b c))为例,
  2. 首先获取到(expt 2 (length list)) ;'(0 1 2 3 4 5 6 7)的整数列表
  3. 将它们转换成各自的二进制形式2->(0,1,0)。所以我们得到'((0,0,0), (0,0,1), (0,1,0), (0,1,1), (1,0,0), (1,0,1), (1,1,0), (1,1,1))
  4. 将'(1 2 3) 映射到二进制文件列表。例如:2->'(0,1,0)->'((0,a) (1,b) (0,c))
  5. 使用 lambda 过滤结果列表,以便我们将元素保留为 1,例如 '((1,b))
  6. 提取幂集

我的方法有问题

它不遵循问题在 1 行中的限制(附加到函数标题)。

(define (powerset list)
  ( ... )) ;; ie the code is contained in 2 lines of 80 characters

我的作业中有这个问题作为奖励问题,但我做不到。

  1. 什么是抽象列表函数?
  • foldlfoldrmap 等函数
  1. 我的奖金包括 3 个子部分
  • 第 1 部分要求以我想要的任何方式简单地实现此功能。所以我使用递归来做到这一点
  • 第 2 部分是我提出问题的部分。这个特别难,因为代码有一个额外的限制,要在 2 行以内
  • 第 3 部分应该是最难的。

不要编写任何辅助函数, 并且不要使用任何显式递归(即,您的函数不能通过名称调用自身)。不要使用任何抽象列表函数。实际上,只使用以下 Racket 函数、常量和特殊形式列表:consfirstrestempty?emptylambdacond

不过,有趣的是,我研究了Y-combinator 并且能够解决这个问题(经过 6 小时的编码)。

【问题讨论】:

  • 您之前的问题已作为重复问题关闭。不要简单地删除它并以相同的方式重新询问它。相反,请阅读另一个问题及其答案;可能他们会解决您的问题。如果他们不这样做,请编辑第一个问题,同时明确您的问题有何不同 - 已关闭的问题可以在编辑时重新打开。
  • @amalloy 不!我也在上一个问题中进行了编辑!但它仍然关闭。问题是使用递归很容易做到这一点。我已经为第 1 部分完成了。我添加了约束部分,它清楚地说明了 - 不使用显式递归(这在您建议的问题中被违反)。谢谢。
  • @amalloy 现在清楚了吗?
  • @ÓscarLópez 我知道它包含一个答案,但它使用 recursion。在再次指出这一点之前,请检查上面的 cmets。是的,这是作业,我在帖子中提到过。截止日期过去了,所以没关系,但我很好奇如何完成。也许我提到的方法是正确的? 2行要求并不愚蠢。在帖子中,我提到我在一行中有 80 个字符的限制。请在指出之前仔细阅读帖子!我只是问我的教授。感谢您抽出宝贵的时间。
  • 回答:(define (pws l)(foldr (lambda (e a) (append (map (lambda (x) (cons e x)) a) a)) '(()) l))

标签: scheme racket fold powerset


【解决方案1】:

回答你的奖金第 2 部分:

(define (pws l) 
  (foldr (lambda (e a) (append (map (lambda (x) (cons e x)) a) a)) '(()) l))

两行,每行少于 80 个字符,第一行保留给define(所以,一个行)。

如果append 不被允许,那么我们也将append ... map 组合变成foldr

(define (pws-fr l) 
  (foldr (lambda (e a)
           (foldr (lambda (x r)
                    (cons (cons e x) r))
                  a a))
         '(()) l))

或者,缩短,

(define (pws-fr-1 l) 
  (foldr (lambda (e a) (foldr (lambda (x r) (cons (cons e x) r)) a a)) '(()) l))

(第二行正好有 80 个字符)。

另一种编码方式是来自this answer 的基于append-map 的代码(第二个sn-p),当仅使用foldr 重新编码时,变为

(define (pws-am-fr l) 
  (foldr (lambda (e a)
           (foldr (lambda (x r)
                    (cons x (cons (cons e x) r)))
                  '() a))
         '(()) l))

或缩短,

(define (pws-am-fr1 l) (foldr (lambda (e a)
   (foldr (lambda (x r) (cons x (cons (cons e x) r))) '() a)) '(()) l))

这可能会或可能不会完全满足您的要求。

【讨论】:

    猜你喜欢
    • 2012-04-05
    • 2012-03-04
    • 1970-01-01
    • 2015-01-08
    • 2017-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多