日期:2014-05-18  浏览次数:20823 次

帮我看看编译器是怎样执行的
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仅仅是产生一个新的字符串,而旧的字符串是不变的。