Scheme 使用抽象列表函数的列表的Powerset
是否可以使用racket函数返回给定列表的功率集Scheme 使用抽象列表函数的列表的Powerset,scheme,racket,fold,powerset,Scheme,Racket,Fold,Powerset,是否可以使用racket函数返回给定列表的功率集 约束- 没有显式递归 使用抽象列表函数 代码包含在两行中(实际要求) 例如: (动力装置(12)) ((12)(1)(2)() 以任何顺序 我发现的另一个仍然使用显式递归 我的工作流程: 以(powerset'(abc))为例 首先得到一个整数列表,最大为(expt 2(长度列表));'(01 2 3 4 5 6 7) 将它们转换为各自的二进制形式2->(0,1,0)。所以我们得到了”((0,0,0,0,1),(0,1,0),(0,1,1)
约束-
例如:
(动力装置(12))
((12)(1)(2)()
以任何顺序
我发现的另一个仍然使用显式递归
我的工作流程:
(powerset'(abc))
为例(expt 2(长度列表));'(01 2 3 4 5 6 7)
2->(0,1,0)
。所以我们得到了”((0,0,0,0,1),(0,1,0),(0,1,1),(1,0,0),(1,0,1),(1,1,0),(1,1,1))
2->'(0,1,0)->'((0,a)(1,b)(0,c))
'((1,b))
我的方法有问题 它不遵循问题在一行中的约束(函数标题之外)
在我的作业中,这个问题是一个额外的问题,但我没能做到
- 像
、foldl
和foldr
map
- 第1部分要求以我想要的任何方式简单地实现这个函数。所以我用递归来实现
- 第二部分是我提出问题的部分。这一条特别困难,因为代码的附加约束是在两行以内
- 第三部分应该是最难的
cons
、first
、rest
、empty?
、empty
、lambda
和cond
然而,有趣的是,我研究了Y-combinator,并且能够解决这个问题(经过6小时的编码)。回答您的奖金第2部分:
(define (pws l)
(foldr (lambda (e a) (append (map (lambda (x) (cons e x)) a) a)) '(()) l))
两行,每行少于80个字符,为定义保留的第一行(因此,一行)
如果不允许append
,则我们将append。。。将
组合映射为一个文件夹
:
(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))
(define (pws-am-fr1 l) (foldr (lambda (e a)
(foldr (lambda (x r) (cons x (cons (cons e x) r))) '() a)) '(()) l))
(第二行正好有80个字符)
另一种编码方法是基于append map
的代码(第二个代码段),当仅使用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-fr-1 l)
(foldr (lambda (e a) (foldr (lambda (x r) (cons (cons e x) r)) a a)) '(()) l))
(define (pws-am-fr1 l) (foldr (lambda (e a)
(foldr (lambda (x r) (cons x (cons (cons e x) r))) '() a)) '(()) l))
可能完全满足您的要求,也可能不完全满足您的要求。您之前的问题以重复的形式结束。不要简单地删除它,然后以相同的方式重新询问它。相反,阅读另一个问题及其答案;也许他们解决了你的问题。如果没有,请编辑第一个问题,同时明确问题的不同之处-关闭的问题可以在编辑时重新打开。@amalloy否!我在前面的问题中也做了编辑!但它仍然关闭。问题是使用递归很容易做到。我已经完成了第一部分。我添加了约束部分,它清楚地说明了-不使用显式递归(这在您提出的问题中被违反)。谢谢。@amalloy现在明白了吗?@ÓscarLópez我知道它包含一个答案,但它使用递归。再次指出这一点之前,请检查上面的注释。是的,是作业,我在帖子里提到过。最后期限过去了,所以这都不重要,但我很好奇怎么能做到。也许我提到的方法是正确的?2行的要求并不愚蠢。在这篇文章中,我提到一行中有80个字符的限制。请仔细阅读后再指出!我会问我的教授谢谢你抽出时间回答:(define(pws l)
(foldr(lambda(ea)(append(map(lambda(x)(cons e x))a))”(())l))