使用過多的遞歸出現錯誤,“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)數據的結構形式是按遞歸定義的。(樹的遍歷,圖的搜索)
遞歸的缺點:
遞歸算法解題的運行效率較低。在遞歸調用的過程當中系統為每一層的返回點、局部量等開辟了棧來存儲。遞歸次數過多容易造成棧溢出等。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM