将方案转换为java
在阅读SICP的过程中,我通过练习2.32进行了鼓励 我们可以将集合表示为不同元素的列表,我们可以 将集合的所有子集的集合表示为列表列表。对于 例如,如果集合是将方案转换为java,java,scheme,lisp,sicp,code-translation,Java,Scheme,Lisp,Sicp,Code Translation,在阅读SICP的过程中,我通过练习2.32进行了鼓励 我们可以将集合表示为不同元素的列表,我们可以 将集合的所有子集的集合表示为列表列表。对于 例如,如果集合是(1 2 3 4),则所有子集的集合都是() (4) (3) (3 4) (2) (2 4) (2 3) (2 3 4) (1) (1 4) (1 3) (1 3 4) (1 2) (1 2 4)(1 2 3)(1 2 3 4))。完成以下对 生成集合的子集集并给出明确的 解释其工作原理: (define (subsets s) (
(1 2 3 4)
,则所有子集的集合都是()
(4) (3) (3 4) (2) (2 4) (2 3) (2 3 4) (1) (1 4) (1 3) (1 3 4) (1 2)
(1 2 4)(1 2 3)(1 2 3 4))
。完成以下对
生成集合的子集集并给出明确的
解释其工作原理:
(define (subsets s)
(if (null? s)
(list nil)
(let ((rest (subsets (cdr s))))
(append rest (map ⟨??⟩ rest)))))
(定义(子集s)
(如果为空,则为空)
(列表“())
(let((rest(子集(cdrs)))
(附加)
休息(地图(兰姆达(x)(cons(s)车x))休息)
)
)))
(子集“(1 2 3 4))
1 ]=>
;价值15:(()(4)(3)(34)(2)(24)(23)(234)(1)(14)(13)(143)(12)(124)(1234))
我可以用schema来做,但在它之后我想:“我怎么用java?”。我考虑过这个问题,因为我不明白,如果我们在每个递归中得到上一个递归的子列表,为什么它会起作用
当然,我可以用另一种方法来解决它。
例如,使用这种方法:所有可能的组合2^N-1,对于我们的例子,这是2^4-1
number binary result
1 0001 (4)
2 0010 (3)
3 0011 (3,4)
4 0100 (2)
5 0101 (2,4)
6 0110 (2,3)
7 0111 (2,3,4)
8 1000 (1)
9 1001 (1,4)
10 1010 (1,3)
11 1011 (1,3,4)
12 1100 (1,2)
13 1101 (1,2,4)
14 1110 (1,2,3)
15 1111 (1,2,3,4)
我重写了一个与java相似的小scheme代码
(定义(子集s)
(如果为空,则为空)
(列表“())
((lambda)(其余)
(附加休息(图(lambda(x)(cons(s)车x))休息)
)(子集(cdr s)))
)
)
(子集“(1、2、3))
1 ]=>
;价值19:(()(4)(3)(34)(2)(24)(23)(234)(1)(14)(13)(143)(12)(124)(1234))
我编写了我的java实现
import java.util.*;
导入java.util.function.UnaryOperator;
导入静态java.util.Arrays.asList;
导入静态java.util.stream.Collectors.*;
公共A类{
公共静态void main(字符串[]args){
列表l=新的数组列表(asList(1,2,3));
System.out.println(子集(l));
}
私有静态列表子集(最终列表){
如果(s.isEmpty())返回新的ArrayList();
最终一元运算符f=(最终列表剩余)->{
最终列表collect=rest.stream()
.map(x->{
列表r=新的ArrayList();
r、 添加(s.get(0));
r、 addAll(x);
返回r;
})
.collect(toList());
rest.addAll(collect);
返回休息;
};
返回f.apply(子集(新的ArrayList(s.subList(1,s.size()))));
}
}
在java中,我有一个空列表(我将Set改为list,以便在不使用任何技巧的情况下通过索引0)。正如我前面提到的,我理解为什么我的java返回空列表,但我不理解如何修复java代码,使其行为与scheme匹配。您的基本情况是错误的。方案表达式
(list'())
的计算结果不是空列表:它的计算结果是一个元素列表,其元素是空列表。在Java中,您编写了new ArrayList()
作为基本大小写,它是一个空列表。相反,使用类似于Arrays.asList(new ArrayList())
@azurefrog的东西是的,我理解。我决定将这段代码从scheme重写为java,因为我注意到了它,不理解它在scheme中是如何工作的。或者可能是我不理解scheme代码中的某些内容,或者是这些语言的语义有点不同?所有子集的集合称为幂集。可以看到它是用多种语言实现的。将OP的return语句替换为returnnewarraylist(Arrays.asList(newarraylist())代码>使程序为我工作。只需返回Arrays.asList(newarraylist())代码>抛出了一个不支持的操作异常
。