递归看不懂
有么有大牛 表达能力强的给我讲下递归啊 是在看不懂他怎么执行的?跳来跳去
static string Test(int i)
{
if (i == 10)
{
return i.ToString();//①
}
else
{
Test(++i);
return i.ToString();//②
}
}
Console.WriteLine(Test(1)); 结果居然是2,
1.为什么第①出 return不跳出?
2.当满足条件后执行else的 ② 为什么他也不出去,++居然成了--了 ,还有他为什么减到2才执行完?条件在哪里
不单单是这个例子 就大牛们帮忙解释下关于递归或许更麻烦的例子
[解决办法]
static string Test(int i) { if (i == 10) { return i.ToString();//① //如果i大于10了,就不在递归了,返回i } else //只要i的值小于10,就以++i作为参数递归,此时i的值+1了 { Test(++i); return i.ToString();//② } }
[解决办法]
static string Test(int i){ if (i == 10) { return i.ToString();//① } else { Test2(++i); return i.ToString();//② }}static string Test2(int i){ if (i == 10) { return i.ToString();//① } else { Test3(++i); return i.ToString();//② }}static string Test3(int i){ if (i == 10) { return i.ToString();//① } else { Test4(++i); return i.ToString();//② }}static string Test4(int i){ if (i == 10) { return i.ToString();//① } else { Test5(++i); return i.ToString();//② }}static string Test5(int i){ if (i == 10) { return i.ToString();//① } else { Test6(++i); return i.ToString();//② }}static string Test6(int i){ if (i == 10) { return i.ToString();//① } else { Test7(++i); return i.ToString();//② }}static string Test7(int i){ if (i == 10) { return i.ToString();//① } else { Test8(++i); return i.ToString();//② }}static string Test8(int i){ if (i == 10) { return i.ToString();//① } else { Test9(++i); return i.ToString();//② }}static string Test9(int i){ if (i == 10) { return i.ToString();//① } else { Test10(++i); return i.ToString();//② }}static string Test10(int i){ return i.ToString();//①}
[解决办法]
他不是没有跳出 建议你在
if (i == 10)
{
return i.ToString();//①
}
里面加一个这个
throw new Exception() 然后看一下StackTrack 也就是堆栈跟踪
static string Test(int i) { return i == 10 ? i.ToString() : Test(++i); } Console.WriteLine(Test(1));//输出10
[解决办法]
递归的运行机制是先递(正向循环,直至结束条件满足为止,本例中的i==10,到此完成了递),后归(就是你所说else里的多次运行,其实是回朔,递归完了在回朔这是递归的机制,回朔的过程就是出栈计算数据的过程)至于本例中为啥会返回结果是2那是因为你的i只是对于方法内部有效,外部是无效的。。。
理解了递归的两个过程及入栈出栈过程这个问题其实很好解释。。。
[解决办法]
你的代码没有处理返回值,所以代码
Console.WriteLine(Test(1));
输出的是最后一次返回的字符串,这最后一次就是2.
如果你希望得到10,9,8,7,6,5,4,3,2,1的输出结果,代码应该这样:
static string Test(int i)
{
return (i == 10) ? i.ToString() : Test(i + 1) + "," + i.ToString();
}
[解决办法]
一句话,你根本没有明白!
仔细看你原先的代码,执行Test(++i);的时候,的确会返回一个值,但是却没有捕获而直接丢弃了,而你后面给的几种写法都对Test(++i)的返回值进行了捕获,这才是差别。换句话说,最初的代码因为没有捕获返回值,这种递归毫无意义。
[解决办法]
建议楼主看一下什么是值类型和引用类型 由于int是值类型,你传入方法里面改变值 根本不会影响它原来的值,还有,递归就是自己调自己,不是你说的return之后它没有跳出,像楼上说的test1,test2.....
[解决办法]
帮你把程序修改了下,帮助理解,希望对你有用
static string Test(int i) { Console.WriteLine(i); if (i == 3) { return i.ToString();//① } else { Test(i+1); Console.WriteLine(i); return i.ToString();//② } }
[解决办法]
T(n)=T(n+1); T(10)=N;