有如下代码片段:
if (n == 2)
{
for (int i = 0; i < m - n + 1; i++)
{
for (int j = i + 1; j < m - n + 2; j++)
{
juzhen[counter, 0] = i + 1;
juzhen[counter, 1] = j + 1;
counter++;
}
}
}
if (n == 3)
{
for (int i = 0; i < m - n + 1; i++)
{
for (int j = i + 1; j < m - n + 2; j++)
{
for (int k = j + 1; k < m - n + 3; k++)
{
juzhen[counter, 0] = i + 1;
juzhen[counter, 1] = j + 1;
juzhen[counter, 2] = k + 1;
counter++;
} }
}
} ......其中n是任意正整数,大家发现for语句和循环体内的语句会随着n的增加而增加,以上是很笨的算法,现在求用do...while替换for循环的通用算法,以适应n不断变化的情况,小弟想了很多天,也没想出来,麻烦各位高手帮想一下
if (n == 2)
{
for (int i = 0; i < m - n + 1; i++)
{
for (int j = i + 1; j < m - n + 2; j++)
{
juzhen[counter, 0] = i + 1;
juzhen[counter, 1] = j + 1;
counter++;
}
}
}
if (n == 3)
{
for (int i = 0; i < m - n + 1; i++)
{
for (int j = i + 1; j < m - n + 2; j++)
{
for (int k = j + 1; k < m - n + 3; k++)
{
juzhen[counter, 0] = i + 1;
juzhen[counter, 1] = j + 1;
juzhen[counter, 2] = k + 1;
counter++;
} }
}
} ......其中n是任意正整数,大家发现for语句和循环体内的语句会随着n的增加而增加,以上是很笨的算法,现在求用do...while替换for循环的通用算法,以适应n不断变化的情况,小弟想了很多天,也没想出来,麻烦各位高手帮想一下
解决方案 »
- 如何获取数据类型
- DataGridView绑定DataTable的问题
- 关于sql语句查询结果填充到datatable中的一个奇怪的问题!
- 一个加密与解密的问题!
- 关于Gridview控件的简单问题!
- 【加班等答案】怎么实现在textBox里动态的显示 在DataGrid中输入数字的和
- C# 读取txt文件 从后往前读 检索到某个字符停下,并将含有该字符的行获取出来!
- 推荐本计算机英汉辞典
- C#中list型数据如何用groupby()和select()进行筛选
- WCF服务端如何获取客户端身份信息?
- 使用ffmpeg将视频转换成flv格式遇的问题
- 高手来看看,Citrix上运行的程序如何获取客户端计算机名
for (int i = 0; i < m - n + 1; i++)
{
for (int j = i + 1; j < m - n + 2; j++)
{
for (int k = j + 1; k < m - n + 3; k++)
{
juzhen[counter, 0] = i + 1;
juzhen[counter, 1] = j + 1;
juzhen[counter, 2] = k + 1;
counter++;
}
}
}
其实就是
for (int i = 0; i < (m - 2) * (m - 1) * m; i++)
{
int n2 = i % n;
juzhen[i, 1] = i + 1 + (i / n) * Math.Pow(n2);
}
{
for (int j = i + 1; j < m - n + 2; j++)
{
for (int k = 0; k < n; k++)//加上这句就可以了...
{
juzhen[counter, 0] = i + 1;
juzhen[counter, 1] = j + 1;
counter++;
}
}
}
好像不太对哦,反映不出n变化的情况,再说juzhen里的第二维是随着n变化的。
123,124,125,134,135,145,234,235,245,345
而当m=5,n=4时则有:
1234,1235,1245,1345,2345
int[,] juzhen = new int[10000000, 10000000];
int m = 99;
int[] ijks;//ijks.Length == n
int mn;// m - n
void DoCalculate(int n)
{
ijks = new int[n];
for (int i = 0; i < n; i++)
ijks[i] = i;
mn = m - n;
bool touchedEnd = false;
while (!touchedEnd)
{
for (int i = 0; i < n; i++)
juzhen[counter, i] = ijks[i] + 1;
counter++; touchedEnd = !UpdateIjks();
}
}
bool UpdateIjks()
{
for (int i = 1; i <= ijks.Length; i++)
{
int xIndex = ijks.Length - i;//from the last to the first
if (ijks[xIndex] < mn + i)
{
//set new values
ijks[xIndex]++;
if (xIndex < ijks.Length - 1)
{//init the following ijks
for (int j = xIndex + 1; j < ijks.Length; j++)
ijks[j] = ijks[j - 1] + 1;
}
return true;
}
}
return false;
}
int counter = 0;
int[,] juzhen = new int[10000000, 10000000];
int m = 99;
int[] ijks;//ijks.Length == n
int mn;// m - n //main function
void DoCalculate(int n)
{
ijks = new int[n];
for (int i = 0; i < n; i++)
ijks[i] = i;
mn = m - n;
bool touchedEnd = false;
while (!touchedEnd)
{
for (int i = 0; i < n; i++)
juzhen[counter, i] = ijks[i] + 1;
counter++; touchedEnd = !UpdateIjks();
}
} //sub function
bool UpdateIjks()
{
for (int i = 1; i <= ijks.Length; i++)
{
int xIndex = ijks.Length - i;//from the last to the first
if (ijks[xIndex] < mn + i)
{
//set new values
ijks[xIndex]++;
if (xIndex < ijks.Length - 1)
{//init the following ijks
for (int j = xIndex + 1; j < ijks.Length; j++)
ijks[j] = ijks[j - 1] + 1;
}
return true;
}
}
return false;
}
int[,] juzhen = new int[10000000, 10000000];
int m = 99;
int[] ijks;//ijks.Length == n
int mn;// m - n //main function
void DoCalculate(int n)
{
ijks = new int[n];
for (int i = 0; i < n; i++)
ijks[i] = i;
mn = m - n;
bool touchedEnd = false;
while (!touchedEnd)
{
for (int i = 0; i < n; i++)
juzhen[counter, i] = ijks[i] + 1;
counter++; touchedEnd = !UpdateIjks();
}
} //sub function
bool UpdateIjks()
{
for (int i = 1; i <= ijks.Length; i++)
{
int xIndex = ijks.Length - i;//from the last to the first
if (ijks[xIndex] < mn + i)
{
//set new values
ijks[xIndex]++;
if (xIndex < ijks.Length - 1)
{//init the following ijks
for (int j = xIndex + 1; j < ijks.Length; j++)
ijks[j] = ijks[j - 1] + 1;
}
return true;
}
}
return false;
}代码咋这么乱呢?
建立一个tree数据结构,root是0;变量i,j=0
i++,用for循环为root加1到m个节点,值为1到m;
然后为root的每个节点重新执行这个代码(就是递归)
tree tree = new tree();
function test(i,n,m,root){
for(var j=1;j<=m;j++){
node nd = roo.add(j);
if(i<n){
test(i+1,n,m,nd);
}
}
}
调用test(0,n,m,tree.root);
然后遍历所有叶子的全路径,就可以得到你要的结果
比较仓促,没有进行边界教研,仅供参考
经过几天的冥思苦想,我自己也找到了解决的方法,还是用for循环,不过效率比递归还低,但也不失为一种比较简洁的解决办法。以下就是具体的代码:
public int[,] GetCombination(int m, int n)
{
int t = 1;
int c = 0;
int zh = combination(m, n); //combination函数是求c(m,n)的组合数
int[,] juzhen = new int[zh, n];
int[] temp = new int[n];
for (int i = 1; i <= m - n + t; i++)
{
temp[t - 1] = i;
if (t < n)
{
t++;
continue;
}
else
{
for (int j = 0; j < n; j++)
{
juzhen[c, j] = temp[j];
}
c++;
for (int k = 1; k < n; k++)
{
if (temp[k] == m - n + k + 1)
{
i = temp[k - 1];
t = k;
break;
}
}
continue;
}
}
return juzhen;
}另外,也贴出递归的算法,以作比较:
其中juzhen和counter是公有的变量
public int[,] GetCombination(int m, int n)
{
for (int i = start; i <= m - n + t; i++)
{
a[t-1] = i;
if (t < n)
{
GetCombination(m, n, i + 1, t + 1);
}
else
{
for (int j = 0; j < n; j++)
{
juzhen[counter, j] = a[j];
}
counter++;
}
}
}