Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将方案转换为java_Java_Scheme_Lisp_Sicp_Code Translation - Fatal编程技术网

将方案转换为java

将方案转换为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) (

在阅读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)
  (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())抛出了一个
不支持的操作异常