zoukankan      html  css  js  c++  java
  • 使用过多的递归出现错误,“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
    ", 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)数据的结构形式是按递归定义的。(树的遍历,图的搜索)
    递归的缺点:
    递归算法解题的运行效率较低。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。

  • 相关阅读:
    C 指针运算 指针访问数组
    C 字符串操作函数
    C putchar getchar
    C语言 指向函数的指针变量基础
    Openstack L2GW Plugin installation
    nova + ironic node
    cgroup
    ironic pxe tftp(二)Permission denied
    ironic bind port neutron port
    Failed to start OpenBSD Secure Shell server
  • 原文地址:https://www.cnblogs.com/zbw911/p/3529459.html
Copyright © 2011-2022 走看看