ssm插入数据时候栈溢出_程序员算法与数据结构基础中的基础,栈与递归
在此之前,我們介紹了動態(tài)規(guī)劃、深度優(yōu)先搜索等基礎算法,但是,有部分好友評論說,難度太難了,我們知道動態(tài)規(guī)劃的自頂向下跟深度優(yōu)先搜索一般都用遞歸實現(xiàn),今天我們就先來講講算法與數據結構中,基礎中的基礎遞歸。講遞歸之前,我們先來了解下棧。
棧是一種基礎的數據結構,每次操作的都是棧頂的數據。我們稱棧頂的方向為上,棧底的方向為下,只有上面的元素已經出棧了,下面元素才能出棧,我們稱之為先進后出。好比這個圖中健身器材,這實際上就是一個棧,最小最上面的那塊鐵最后安裝進去,卻最先被取出來,最大的那個鐵圈,最早安裝進去,最晚取出來。(找了好久才找到一個現(xiàn)實生活中常見又大眾的例子,作為一個程序員,生活真的是比較單調)
棧是一種支持Push跟Pop兩種數據結構,他的基本操作如下圖所示,每次push操作,實際上都是往棧的上方插入一個元素,Pop操作,則是把棧最上方的元素彈出來。
那么這個棧跟我們要講的遞歸到底是什么關系呢?我們先看一看這個問題,求一個數的階乘,一個正整數的階乘是1到它本身所有正整數的乘積,我們用遞歸的方式來實現(xiàn)這個功能。
這個代碼在操作系統(tǒng)里面是怎么執(zhí)行的呢,操作系統(tǒng)本身就有一個運行時候的棧。我們假設求5的階乘,操作系統(tǒng)執(zhí)行到第5行,發(fā)現(xiàn)這是一個遞歸,就會把它加到系統(tǒng)棧里面,并且記錄下我在執(zhí)行fact方法,x等于5,執(zhí)行到第5行,然后開始計算4,執(zhí)行到第5行,發(fā)現(xiàn)是個遞歸,又把他記錄到系統(tǒng)棧里面,記錄下,正在執(zhí)行fact方法,x等于4,計算到第5行。。。直到執(zhí)行到x等于1,然后退出,系統(tǒng)開始退棧,回到剛才X等于2的時候,從第5行開始執(zhí)行,然后執(zhí)行第6行,接著退出,執(zhí)行x=3的時候。。。最后,到了棧底x=5,計算完之后棧沒有元素了,整個方法執(zhí)行完畢!
我們常常說暴棧,也就是Stack Overflow,說的就是系統(tǒng)棧溢出,造成這種問題的一般原因都是因為遞歸沒有退出條件!所以操作系統(tǒng)不停遞歸,類似與死循環(huán)。上述例子中,當x等于的時候就退出,就是退出條件。另外一種可能,是本身數據量就非常大,也有可能會造成Stack Overflow,這種一般的解決方法也有三種,一是增大系統(tǒng)棧空間,二是使用非遞歸的方法,三是減少遞歸過程中棧空間的使用。
總結
以上是生活随笔為你收集整理的ssm插入数据时候栈溢出_程序员算法与数据结构基础中的基础,栈与递归的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二叉树的深度_[LeetCode 104
- 下一篇: 服务器负载不高 响应慢_京东面试官问我什