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