使用过多的递归出现错误,“System.StackOverflowException”类型的未经处理的异常在 mscorlib.dll 中发生

class Program
    {
        static void Main(string[] args)
        {
            sub(0);
        }
 
 
        private static void sub(int count)
        {
            if (count > 100000)
                return;
 
            Console.WriteLine(count);
 
            sub(++count);
        }
    }

C#的错误

image

 

 
void sub(int i)
{
    if (i > 10000)
        return;
 
    printf("%d\r\n", i);
 
    sub(++i);
}
int _tmain(int argc, _TCHAR* argv[])
{
    sub(0);
    return 0;
}

C++的错误

image

 

分析一下就大概明白了,由于递归数据放在栈里,递归不断的压栈,.NET framework Runtime 就抛出异常。 C++ 也是同样的问题,以后对于可预知的递归可以用,对于不可预知的就不要用了。

 

 

参见:

http://baike.soso.com/v111972.htm

 

注意:
(1) 递归就是在过程或函数里调用自身;
(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
递归算法一般用于解决三类问题:
(1)数据的定义是按递归定义的。(Fibonacci函数)
(2)问题解法按递归算法实现。(回溯)
(3)数据的结构形式是按递归定义的。(树的遍历,图的搜索)
递归的缺点:
递归算法解题的运行效率较低。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。

posted @ 2014-01-22 11:26  张保维  阅读(3979)  评论(0编辑  收藏  举报