帮我看看编译器是怎样执行的
static void Main(string[] args)
{
Permutate("12345", "", 0);
}
static void Permutate(string str, string result, int length)
{
if (str.Length == length)
{
Console.WriteLine(result);
}
for (int i = 0; i < str.Length; i++)
{
Permutate(str.Remove(i, 1), result + str[i], length);
}
}
请那位解释下, Permutate(str.Remove(i, 1), result + str[i], length);中
比如 str为12345时
执行了str.Remove(i, 1)(此时i=0)后str为2345
接下来执行result + str[i](此时i=0)
此时的str[i]应该为2才对啊,
为什么,编译器此时编译的结果为1啊
大家不信的话可以编译试一下,
请各位高手指点!在下十分困惑!
------解决方案--------------------晕,怎么会?
第一次执行Permutate时:
length=0,且lenght!=str.Length.
开始执行循环,循环的执行是从0-(str.Length-1)
第一次i==0,调用
Permutate(str.Remove(0,1),result+str[0],length);
第二次i==1,调用
Permutate(str.Remove(1,1),result+str[1],length);
实际上来说,相当于某某一个字符取出来,添加到result当中。
这其实是一个用递归方法进行全排列的问题。
------解决方案--------------------str为12345时
执行了str.Remove(i, 1)(此时i=0)后str 仍然为12345
str.Remove(i, 1)返回的是另外的字符串。
不信你执行下面的试下。
string s = "12345";
string s1 = s.Remove(0, 1);
Console.WriteLine("s=" + s);
Console.WriteLine("s1=" + s1);
------解决方案--------------------up
------解决方案--------------------str是不变的,执行了remove仅仅是产生一个新的字符串,而旧的字符串是不变的。