【发布时间】:2021-03-07 02:14:57
【问题描述】:
是否有可能制作一个球拍函数来返回给定列表的 powerset ?
约束-
- 没有显式递归
- 使用抽象列表函数
- 两行代码(实际要求)
例如:
(powerset '(1 2))
'((1 2) (1) (2) ())
按任意顺序。
我发现的另一个question 仍然使用显式递归。
我的工作流程:
- 以
(powerset '(a b c))为例, - 首先获取到
(expt 2 (length list)) ;'(0 1 2 3 4 5 6 7)的整数列表 - 将它们转换成各自的二进制形式
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)) - 将'(1 2 3) 映射到二进制文件列表。例如:
2->'(0,1,0)->'((0,a) (1,b) (0,c)) - 使用 lambda 过滤结果列表,以便我们将元素保留为 1,例如
'((1,b))。 - 提取幂集
我的方法有问题
它不遵循问题在 1 行中的限制(附加到函数标题)。
(define (powerset list)
( ... )) ;; ie the code is contained in 2 lines of 80 characters
我的作业中有这个问题作为奖励问题,但我做不到。
- 什么是抽象列表函数?
-
foldl、foldr和map等函数
- 我的奖金包括 3 个子部分
- 第 1 部分要求以我想要的任何方式简单地实现此功能。所以我使用递归来做到这一点
- 第 2 部分是我提出问题的部分。这个特别难,因为代码有一个额外的限制,要在 2 行以内
- 第 3 部分应该是最难的。
不要编写任何辅助函数, 并且不要使用任何显式递归(即,您的函数不能通过名称调用自身)。不要使用任何抽象列表函数。实际上,只使用以下 Racket 函数、常量和特殊形式列表:
cons、first、rest、empty?、empty、lambda和cond。
不过,有趣的是,我研究了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