递归看不懂
有么有大牛 表达能力强的给我讲下递归啊 是在看不懂他怎么执行的?跳来跳去
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才执行完?条件在哪里
不单单是这个例子 就大牛们帮忙解释下关于递归或许更麻烦的例子
[解决办法]
- C# code
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();//② } }
[解决办法]
[解决办法]
我纠正下,有些回答可能会让你理解偏差。
这个程序算递归,判断递归的原则很简单,就是看程序有没有调用自己。
其实递归没有什么神秘的,只是自己调用自己会有些让人觉得混淆。
如同
foo()
{
int i = 3;
bar(3);
}
bar(int x)
{
int i; //这个i和foo中的i无关,不难理解吧
}
一样,
如果自己调用自己,那么下一层调用内的变量和上一层也没有关系。
[解决办法]
首先 你不知道对栈是否了解 每次调用 都会生产新的i在栈顶 每次return 都会让这个i退栈 但是由于i是值类型 所以说你看到的所谓i从10减到2不是在执行--操作 而是说这个i本身并没有被改变 而是在递归调用的时候传了一个复制进去 所以最终输出的只是++i的结果
[解决办法]
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();//②
}
}
[解决办法]
- C# code
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 也就是堆栈跟踪
[解决办法]
递归顺序
Test(1) i = 2 -> Test(2) i = 3 -> ... Test(9) i = 10 -> Test(10)
返回值
Test(10) i = 10 return 10 -> Test(9) i = 10 -> return 10 -> Test(8) i = 9 return 9 Test(7) -> ...-> Test(2) i = 3 return 3 -> Test(1) i = 2 -> return 2 -> 主线程调用函数
所以结果就是2
[解决办法]
想要输出10可以这么写
- C# code
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.....
[解决办法]
帮你把程序修改了下,帮助理解,希望对你有用
- C# code
static string Test(int i) { Console.WriteLine(i); if (i == 3) { return i.ToString();//① } else { Test(i+1); Console.WriteLine(i); return i.ToString();//② } }
[解决办法]
[解决办法]
这个例子四个很糟糕的递归例子,对初学者会造成困扰。
递归思想跟一个人受到的“数学归纳法”或者“形式逻辑解析方法”的训练息息相关。最初理解归纳方法时,我们都习惯于直观地看到收敛的效果。而这个题目却是以
- HTML code
T(n)=T(n+1); T(10)=N;