从0到n的排列的一种求法(效率低,急需改进)
用到了split和backgroundWorker。textbox用来接收输入,lixtbox输出。button开始计算。
private void button1_Click(object sender, EventArgs e)
{
int needtocal = int.Parse(textBox1.Text);
backgroundWorker1.RunWorkerAsync(needtocal);
}
//计算
public string CalPermutation(int n)
{
string result = "";
if (n < 0) return "";
if (n == 0)
{
result = "0";
}
else if (n == 1)
{
result = "01,10";
}
else
{
string last = CalPermutation(n - 1);
string delimStr = ",";
char[] delimiter = delimStr.ToCharArray();
string[] split = null;
split = last.Split(delimiter);
foreach (string s in split)
{
for (int i = 0; i < n + 1; i++)
{
if (result != "")
result += ",";
result += s.Insert(i, n.ToString());
}
}
}
return result;
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
e.Result = CalPermutation((int)e.Argument);
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// First, handle the case where an exception was thrown.
if (e.Error != null)
{
MessageBox.Show(e.Error.Message);
}
else
{
// handle the case where the operation
// succeeded.
string delimStr = ",";
char[] delimiter = delimStr.ToCharArray();
string[] split = null;
split = e.Result.ToString().Split(delimiter);
foreach (string ss in split)
{
listBox1.Items.Add(ss);
}
}
}