Descripción del problema:
Dado un conjunto unidimensional, encuentre un subconjunto del conjunto.
Subconjunto: El subconjunto es un concepto matemático: si algún elemento del conjunto A es un elemento del conjunto B, entonces el conjunto A se denomina subconjunto del conjunto B. Lenguaje simbólico: si ∀a∈A, todos tienen a∈B, entonces A⊆B.
Análisis de ideas: el seguimiento de su esencia, de hecho, el subconjunto es agregar o no agregar nuevos elementos. Por ejemplo, si solo hay un elemento, consideramos agregar o no agregar este elemento sobre la base del conjunto vacío, y luego podemos formar dos conjuntos (uno es el conjunto vacío y el otro es este elemento), que es la salida recursiva. Por lo tanto, para resolver un subconjunto de un conjunto, primero debemos resolver recursivamente el conjunto que se encuentra sobre él y luego atravesar cada conjunto pequeño del conjunto anterior, considerando si se agrega o no, se puede resolver.
El código es el siguiente:
import java.util.HashSet;
import java.util.Set;
public class Zj {
//求解一个集合的所有子集(归根是上一级元素对新元素的加与不加)
static Set<Set<Integer>> zj(Integer[]a,int n)
{
Set<Set<Integer>> nej=new HashSet<>();//返回的集合声明
if(n==0)//递归出口
{ Set<Integer> temp1 =new HashSet<>();
temp1.add(a[n]);
nej.add(temp1);//加上第一个元素
Set<Integer> temp =new HashSet<>();
nej.add(temp);//加上一个空集
return nej;//返回集合
}
Set<Set<Integer>> old=zj(a,n-1);//递归求解出上一层集合
for (Set<Integer> j:old)//对上一层集合的每一个元素进行加与不加新元素
{
nej.add(j);//不加新元素,原始输出
Set<Integer> clone=(Set<Integer>)((HashSet<Integer>)j).clone();
clone.add(a[n]);//利用集合克隆体进行加上新元素
nej.add(clone);
}
return nej;
}
public static void main(String[] args) {
Integer []a={1,2,3};
Set<Set<Integer>> b=zj(a,a.length-1);
System.out.println(b);
}
}
Presta atención a la clonación de la colección.
Los resultados son los siguientes: