有么有大牛 表达能力强的给我讲下递归啊 是在看不懂他怎么执行的?跳来跳去
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();//①
}
else
{
Test(++i);
return i.ToString();//②
}
}Console.WriteLine(Test(1)); 结果居然是2,
1.为什么第①出 return不跳出?
2.当满足条件后执行else的 ② 为什么他也不出去,++居然成了--了 ,还有他为什么减到2才执行完?条件在哪里不单单是这个例子 就大牛们帮忙解释下关于递归或许更麻烦的例子
解决方案 »
- DataView.RowFilter怎么用呀
- C#操作Excel,如何区分区域和区域内的每一个单元格。
- System.Diagnostics.Process.Start(@"\\Program Files\\player\\player.exe");错在哪里啊,
- C# 自动播放音乐怎么做?出现问题了~~~
- 谁有税控机与一般的程序接口吗?
- 急 求正则表达式:匹配 HTML 中 的图片路径 为 本地硬盘路径的.
- 处理XML和处理文本文档速度问题
- 谁有.net bate2版的安装key?
- 数据同步的问题
- C#萌新一个小问题
- C#多行的textbox如何逐行显示数据?
- 做计算器的话, the interface below is much better
实参i 在一次运行后进入到else只会进行一次++操作 所以1=》2因为传入的是值类型 传入的始终是值而非内存地址 下次循环时就是用的另一个int 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();//②
}
}
传入小于10的数 最终都会止步于10
大于10的话就成了死循环了
static string Test(int i)
{
if (i == 10)
{
return i.ToString();//① //如果i大于10了,就不在递归了,返回i
}
else //只要i的值小于10,就以++i作为参数递归,此时i的值+1了
{
Test(++i); //小于10就递归了 而没有执行下面的return 从1-10 然后到10后 会执行上面if 最后执行return i.ToString();//②
return i.ToString();//②
}
}
{
这根本不算递归,方法首次传入参数是1,第一个if不满足,因为1小于10,进到else里面,++i,此时i是2,虽然再次调用了Test,但不处理返回值,而且参数值类型传入的是副本,任你里面怎么处理,外面还是不变,最后i.ToString,就是‘2’。}但是我单步调试的话,他会进到①里边,这时候为什么不跳出?
另外单步调试 当i==10执行完return i.ToString()。他会直接跳到最后一个大括号,然后返回
Test(++i) 然后一直执行 Test (++i) 和 return i.ToString()和最后一个大扩好,然后 i的值从10一直退到2,我只是想了解他的执行过程,他什么会这样执行,递归原理是啥,
foo()
{
int i = 3;
bar(3);
}
bar(int x)
{
int i; //这个i和foo中的i无关,不难理解吧
}
一样,
如果自己调用自己,那么下一层调用内的变量和上一层也没有关系。
{
if (i == 10)
{
return i.ToString();//① //如果i大于10了,就不在递归了,返回i
}
else //只要i的值小于10,就以++i作为参数递归,此时i的值+1了
{
Test(++i);
return i.ToString();//②
}
}
{
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();//①
}这个方法执行时展开就是上面这些,你把这些加到代码里替换原先的 Test 方法,执行 Console.WriteLine(Test(1)) ,单步看运行过程你就明白了
return i.ToString();//②
}
当i满足10时候他会重复执行这一段, 等于return了 多次都没有跳出,但最终他跳出了 这时候i=2,想知道他为什么多执行了这么多次 还有i=2 时候怎么跳出了?为什么呢?
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
{
return i == 10 ? i.ToString() : Test(++i);
} Console.WriteLine(Test(1));//输出10
static string Test(int i)
{
return i == 10 ? i.ToString() : Test(++i);
} Console.WriteLine(Test(1));//输出10
怎么有晕了
他不是和 if else 相等么 他怎么会输出10呢??
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();
}
却是是返回了10,10,9,8,7,6,5,4,3,2
为什么之前的I他没有保存了值 是因为他是值类型,每次递归传递的只是他的副本,那么这个该如何解释呢,他为什么返回了这么一串,
我知道他是字符串,引用类型,但是看不到他叠加啊,那么这个递归拆分开来用22楼回答的这种理解,应该是什么形式
仔细看你原先的代码,执行Test(++i);的时候,的确会返回一个值,但是却没有捕获而直接丢弃了,而你后面给的几种写法都对Test(++i)的返回值进行了捕获,这才是差别。换句话说,最初的代码因为没有捕获返回值,这种递归毫无意义。
static string Test(int i)
{
Console.WriteLine(i);
if (i == 3)
{
return i.ToString();//①
}
else
{
Test(i+1);
Console.WriteLine(i);
return i.ToString();//②
}
}