c#求幂集
答案:1 悬赏:60 手机版
解决时间 2021-03-28 05:52
- 提问者网友:疯子也有疯子的情调
- 2021-03-27 09:49
c#求幂集
最佳答案
- 五星知识达人网友:杯酒困英雄
- 2021-03-27 10:02
你这用的回溯法
string x = GetElem(A, i);
int k = GetLength(B);
B.Insert(k, x);
GetPowerSet(i + 1, A, B);
B.RemoveAt(k);
GetPowerSet(i + 1, A, B);每次先左加再右去,相当于在A的基础上每次左右移动一位,B就是移动后的结果,移到最后B就是空了,也就是最后那个{空}。
你要想记录最后的结果,那你还得引入第三个集合C。
修改后如下:
static void Main(string[] args)
{
ArrayList A = new ArrayList();
A.Add("1");
A.Add("2");
A.Add("3");
A.Add("4");
ArrayList B = new ArrayList();
List C = new List(); // 结果集
Program p = new Program();
p.GetPowerSet(0, A, B, ref C);
Console.WriteLine(C.Count);
Console.ReadLine();
}
void GetPowerSet(int i, ArrayList A, ArrayList B, ref List C)
{
if (i == A.Count)
{
C.Add(B);
}
else
{
string x = GetElem(A, i);
int k = GetLength(B);
B.Insert(k, x);
GetPowerSet(i + 1, A, B, ref C);
B.RemoveAt(k);
GetPowerSet(i + 1, A, B, ref C);
}
}
string GetElem(ArrayList A, int i)
{
return A[i].ToString();
}
int GetLength(ArrayList A)
{
int i = 0;
foreach (string a in A)
{
if (a != "0")
{
i++;
}
}
return i;
}追问呵呵,非常感谢大哥这么耐心!后来我也是这么做的,代码的写法都一模一样,但这并不是最关键的,你看这个结果:
结果是,集合的总数量是对的,但是每一个里面的元素都是空的,感觉是深拷贝浅拷贝的问题,但是不会解决啊,还请大哥不胜赐教啊!
追答徒手写的代码,疏忽了引用类型的问题。
ArrayList 是一个引用类型,别看往C里面Add了好几个B,实际上都指向了同一个对象,又Insert()又RemoveAt的对它们都有影响。
C.Add(B);改成:
C.Add((ArrayList)B.Clone());即可。
追问 太棒了,真的解决了。我也试过Clone()
ArrayList Tmp = new ArrayList();
if (i == A.Count)
{
Clone();
Tmp = B.Clone() as ArrayList;
C.Add(Tmp);
}
结果不行,也搞不清怎么回事!总之谢谢!也不知道为啥,我的浏览器百度知道不显示代码选项,难为你了,呵呵!
string x = GetElem(A, i);
int k = GetLength(B);
B.Insert(k, x);
GetPowerSet(i + 1, A, B);
B.RemoveAt(k);
GetPowerSet(i + 1, A, B);每次先左加再右去,相当于在A的基础上每次左右移动一位,B就是移动后的结果,移到最后B就是空了,也就是最后那个{空}。
你要想记录最后的结果,那你还得引入第三个集合C。
修改后如下:
static void Main(string[] args)
{
ArrayList A = new ArrayList();
A.Add("1");
A.Add("2");
A.Add("3");
A.Add("4");
ArrayList B = new ArrayList();
List C = new List(); // 结果集
Program p = new Program();
p.GetPowerSet(0, A, B, ref C);
Console.WriteLine(C.Count);
Console.ReadLine();
}
void GetPowerSet(int i, ArrayList A, ArrayList B, ref List C)
{
if (i == A.Count)
{
C.Add(B);
}
else
{
string x = GetElem(A, i);
int k = GetLength(B);
B.Insert(k, x);
GetPowerSet(i + 1, A, B, ref C);
B.RemoveAt(k);
GetPowerSet(i + 1, A, B, ref C);
}
}
string GetElem(ArrayList A, int i)
{
return A[i].ToString();
}
int GetLength(ArrayList A)
{
int i = 0;
foreach (string a in A)
{
if (a != "0")
{
i++;
}
}
return i;
}追问呵呵,非常感谢大哥这么耐心!后来我也是这么做的,代码的写法都一模一样,但这并不是最关键的,你看这个结果:
结果是,集合的总数量是对的,但是每一个里面的元素都是空的,感觉是深拷贝浅拷贝的问题,但是不会解决啊,还请大哥不胜赐教啊!
追答徒手写的代码,疏忽了引用类型的问题。
ArrayList 是一个引用类型,别看往C里面Add了好几个B,实际上都指向了同一个对象,又Insert()又RemoveAt的对它们都有影响。
C.Add(B);改成:
C.Add((ArrayList)B.Clone());即可。
追问 太棒了,真的解决了。我也试过Clone()
ArrayList Tmp = new ArrayList();
if (i == A.Count)
{
Clone();
Tmp = B.Clone() as ArrayList;
C.Add(Tmp);
}
结果不行,也搞不清怎么回事!总之谢谢!也不知道为啥,我的浏览器百度知道不显示代码选项,难为你了,呵呵!
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯