首页 新闻 会员 周边 捐助

把N层for循环怎么转换成递归形式

0
悬赏园豆:50 [已解决问题] 解决于 2010-05-28 14:26
代码
public Hashtable GetHashtable()
{
//数组不确定,有可能加有可能减 现在这种做法是固定死的嵌套循环
//想改成递归做法,可以根据动态的数组长度进行循环
int[] arr = new int[] {1,2, 4, 8, 16, 32, 64 };
Hashtable dic
= new Hashtable();
for (int i = 0; i < arr.Length; i++)
{
string str = string.Empty;
int value = 0;
for (int j = i + 1; j < arr.Length; j++)
{
str
= arr[i].ToString() + "+" + arr[j].ToString();
value
= arr[i] + arr[j];
dic.Add(str, value);
for (int k = j + 1; k < arr.Length; k++)
{
str
= arr[i].ToString() + "+" + arr[j].ToString() + "+" + arr[k].ToString();
value
= arr[i] + arr[j] + arr[k];
dic.Add(str, value);
for (int n = k + 1; n < arr.Length; n++)
{
str
= arr[i].ToString() + "+" + arr[j].ToString() + "+" + arr[k].ToString() + "+" + arr[n].ToString();
value
= arr[i] + arr[j] + arr[k] + arr[n];
dic.Add(str, value);
for (int m = n + 1; m < arr.Length; m++)
{
str
= arr[i].ToString() + "+" + arr[j].ToString() + "+" + arr[k].ToString() + "+" + arr[n].ToString() + "+" + arr[m].ToString();
value
= arr[i] + arr[j] + arr[k] + arr[n] + arr[m];
dic.Add(str, value);
for (int a = m + 1; a < arr.Length; a++)
{
str
= arr[i].ToString() + "+" + arr[j].ToString() + "+" + arr[k].ToString() + "+" + arr[n].ToString() + "+" + arr[m].ToString() + "+" + arr[a].ToString();
value
= arr[i] + arr[j] + arr[k] + arr[n] + arr[m] + arr[a];
dic.Add(str, value);
for (int b = a + 1; b < arr.Length; b++)
{
str
= arr[i].ToString() + "+" + arr[j].ToString() + "+" + arr[k].ToString() + "+" + arr[n].ToString() + "+" + arr[m].ToString() + "+" + arr[a].ToString() + "+" + arr[b].ToString();
value
= arr[i] + arr[j] + arr[k] + arr[n] + arr[m] + arr[a] + arr[b];
dic.Add(str, value);
}
}
}
}
}
}
}
return dic;
}

 

铁掌水上漂的主页 铁掌水上漂 | 初学一级 | 园豆:8
提问于:2010-05-28 09:59
< >
分享
最佳答案
0

如果你数组中的数是 2 的 n 次冥,那根本不需要这么复杂,只需要按位操作就可以。看我写的代码,就两个循环,你的数组中的值可以增加减少,都可以得到你所要的结果。效率应该比你这种多重循环,或者你所希望的递归调用要高很多。

 

代码
int[] arr = new int[] {1,2, 4, 8, 16, 32, 64 };
Hashtable dic
= new Hashtable();

int max = arr[arr.Length - 1] * 2 - 1; //最大值是所有位都是1的情况

for (int data = 1; data <= max; data++)
{
int bit = 0x00000001;
int hitCount = 0; //某一位为1的次数,在这里,我们要排除掉只有一个数的情况

string key = "";

for (int i = 0; i < arr.Length; i++) //最多遍历到数组指定的最大位
{
if ((data & bit) != 0)
{
if (hitCount++ == 0)
{
key
= Math.Pow(2, i).ToString();
}
else
{
key
+= "+" + Math.Pow(2, i).ToString();
}
}

bit
<<= 1;
}

if (hitCount > 1)
{
dic.Add(key, data);
}
}

 

收获园豆:50
eaglet | 专家六级 |园豆:17139 | 2010-05-28 10:37
你的做法很好,谢谢指点。
铁掌水上漂 | 园豆:8 (初学一级) | 2010-05-28 11:08
其他回答(1)
0

int[] arr = new int[] {1,2, 4, 8, 16, 32, 64 };
Hashtable dic
= new Hashtable();

GetHashtable(arr,
0);

public Hashtable GetHashtable(int[] arr,int index )
{
string mstr =string.Empty;
int mvalue =0;

if(index==0) //第一层
{
for (int i = 0; i < arr.Length; i++)
{
mstr
+=arr[i].ToString();
mvalue
+=arr[i];
GetHashtable(arr,i);
}
}
else //随后的递归
{
mstr +=arr[i].ToString();
mvalue
+=arr[i];
 dic.Add(mstr, mvalue);
for (int i = index + 1; i < arr.Length; i++)
{
string str =mstr+arr[i].ToString();
int value =mvalue+arr[i];
dic.Add(str, value);
GetHashtable(arr,i);
}
}
}

 

没有vs测试不了,不知行不行,不过思路应该没错的:)

LittlePeng | 园豆:3445 (老鸟四级) | 2010-05-28 10:53
看上去似乎是正确的,还没去验证,谢谢你的指点
支持(0) 反对(0) 铁掌水上漂 | 园豆:8 (初学一级) | 2010-05-28 11:09
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册