首页新闻找找看学习计划

递归新手问题

0
悬赏园豆:20 [已解决问题] 解决于 2012-06-20 20:37

有么有大牛 表达能力强的给我讲下递归啊 是在看不懂他怎么执行的?跳来跳去
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才执行完?条件在哪里

不单单是这个例子 就大牛们帮忙解释下关于递归或许更麻烦的例子

问题补充:

我就是不懂递归的原理,请教原理啊,单次的计算结果不能让我明白什么

keeppuching的主页 keeppuching | 初学一级 | 园豆:6
提问于:2012-06-14 10:00
< >
分享
最佳答案
0

哪里有变成"--",就是"++ "啊,只是你接收的只是Test(1);的值而已,它每个值都计算了,你没有接收而已,你在下面再写个Console.WriteLine(Test(2));//它就会输出3,只要你接收它,他都会输出的,你要是真想看它的调用可以用下面的代码:

class Program
    {
        static void Test(int i)
        {
            if (i == 10)
            {
                return ;//①
            }
            else
            {
                Test(++i);
                Console.WriteLine(i.ToString());//②
            }
        }


        static void Main(string[] args)
        {
            int i = 1;
            Test(i);
            Console.ReadKey();
        }
    }

//输出结果:10,9,8......2;

收获园豆:10
ajie1166 | 菜鸟二级 |园豆:249 | 2012-06-14 21:44
其他回答(4)
0

递归算法解决问题的特点:

 

  (1) 递归就是在过程或函数里调用自身。

 

  (2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。

 

  (3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。

 

  (4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。

墨猦 | 园豆:668 (小虾三级) | 2012-06-14 10:15
0

1、不是最外层当然不会跳出

2、跟上面原因一样,不是最外层就不会跳出,所以i先加到10后一层层的返回,直到最外层,最外层的i只执行了一次++,所以最后是2

收获园豆:5
artwl | 园豆:16526 (专家六级) | 2012-06-14 10:22
0
static string Test(int i)
{
    if (i == 10)
    {
        return i.ToString();
    }
    else
    {
        return Test(++i);
    }
}

修改成上面的代码,你看下运行结果。

这个才是常规的递归调用。

不能说你写的 代码不递归,而是。。。你没理解递归的本质。除了递归外,还有一个叫迭代的东西,很类似递归。

参考文档:递归迭代_百度文库

收获园豆:5
无之无 | 园豆:5085 (大侠五级) | 2012-06-14 11:48
0

你要把程序想成一个模板,每次调用Test都有一个新的Test方法在执行,每次的return只是从当前的test中跳出,每个test之间是没有关系的。

today4king | 园豆:3267 (老鸟四级) | 2012-06-14 14:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册