今天看论坛,看到有个求助,要求不要for或while,实现全排列。感觉很有难度,自己试了一下,还真不能省略for。
代码编写完成后,感觉很“Ugly”,以前看过一篇文章,好像是说编程的思想跟艺术,现在有点体会到了。
同样是实现某种功能,艺术的编程,程序的整体布局,之间接口对象的设计,各种知识的运用,一气呵成,增一份则肥,减一份则瘦,浑然天成。对比起那种境界,我的只能称为涂鸦式了,缝缝补补的,磕磕撞撞的。
要把编程变成一种艺术,还真是路漫漫兮。
using
System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.IO;
namespace Date1219
... {
class NumArrangement
...{
/**//// <summary>
/// 实现任意输入字符串的全排列
///
/// 如输入“ABC”会得到6组全排,输入“ABCD”得到24组全排
///
/// 程序利用了插位的思路,递归排列。
///
/// 编程中,印象比较深刻的是,Arraylist的深层拷贝问题,正确使用拷贝将使代码大为精炼直观。
/// 具体技术参考了http://topic.csdn.net/t/20051026/10/4350726.html 里面的内容。
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public ArrayList Arrange(string str)
...{
ArrayList list = new ArrayList();
for (int i = 0; i < str.Length; i++)
...{
list = InsertValue(str[i].ToString(), list);
}
return list;
}
public ArrayList InsertValue(string str, ArrayList list)
...{
int rowct = list.Count;
int rayct;
ArrayList list2 = new ArrayList();
if (list.Count >0)
...{
ArrayList temp = (ArrayList)list[0];
rayct = temp.Count;
for (int i = 0; i < rowct; i++)
...{
for (int j = 0; j < rayct+1; j++)
...{
ArrayList list4 = new ArrayList((ArrayList)list[i]);//Arraylist 的深度复制
list4.Insert(j, str);
list2.Add(list4);
}
}
}
else
...{
rayct = 0;
list.Add(str);
list2.Add(list);
}
return list2;
}
//打印
public void PrintList(ArrayList list)
...{
for (int i = 0; i < list.Count; i++)
...{
ArrayList list2 = (ArrayList)list[i];
for (int j = 0; j < list2.Count; j++)
...{
Console.Write(list2[j] + " ");
}
Console.WriteLine();
}
Console.ReadLine();
}
}
class Test
...{
public static void Main(String[] args)
...{
NumArrangement na = new NumArrangement();
//交互界面
Console.WriteLine("Input your Num:");
string input = Console.ReadLine();
Console.WriteLine("Your Number Arrangement:");
ArrayList list = na.Arrange(input);
na.PrintList(list);
}
}
}
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.IO;
namespace Date1219
... {
class NumArrangement
...{
/**//// <summary>
/// 实现任意输入字符串的全排列
///
/// 如输入“ABC”会得到6组全排,输入“ABCD”得到24组全排
///
/// 程序利用了插位的思路,递归排列。
///
/// 编程中,印象比较深刻的是,Arraylist的深层拷贝问题,正确使用拷贝将使代码大为精炼直观。
/// 具体技术参考了http://topic.csdn.net/t/20051026/10/4350726.html 里面的内容。
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public ArrayList Arrange(string str)
...{
ArrayList list = new ArrayList();
for (int i = 0; i < str.Length; i++)
...{
list = InsertValue(str[i].ToString(), list);
}
return list;
}
public ArrayList InsertValue(string str, ArrayList list)
...{
int rowct = list.Count;
int rayct;
ArrayList list2 = new ArrayList();
if (list.Count >0)
...{
ArrayList temp = (ArrayList)list[0];
rayct = temp.Count;
for (int i = 0; i < rowct; i++)
...{
for (int j = 0; j < rayct+1; j++)
...{
ArrayList list4 = new ArrayList((ArrayList)list[i]);//Arraylist 的深度复制
list4.Insert(j, str);
list2.Add(list4);
}
}
}
else
...{
rayct = 0;
list.Add(str);
list2.Add(list);
}
return list2;
}
//打印
public void PrintList(ArrayList list)
...{
for (int i = 0; i < list.Count; i++)
...{
ArrayList list2 = (ArrayList)list[i];
for (int j = 0; j < list2.Count; j++)
...{
Console.Write(list2[j] + " ");
}
Console.WriteLine();
}
Console.ReadLine();
}
}
class Test
...{
public static void Main(String[] args)
...{
NumArrangement na = new NumArrangement();
//交互界面
Console.WriteLine("Input your Num:");
string input = Console.ReadLine();
Console.WriteLine("Your Number Arrangement:");
ArrayList list = na.Arrange(input);
na.PrintList(list);
}
}
}