尾遞歸是什么意思 尾遞歸究竟是好是壞?
尾遞歸究竟是好是壞?概念遞歸如果層次太多,就會照成棧溢出異常,因為每調用一次就會新生成一個棧幀,使用這個棧幀保留當前函數(shù)的狀態(tài)值。如果沒有必要保存狀態(tài)值,那么就可以復用棧幀,不會造成棧溢出。舉例這里以
尾遞歸究竟是好是壞?
概念
遞歸如果層次太多,就會照成棧溢出異常,因為每調用一次就會新生成一個棧幀,使用這個棧幀保留當前函數(shù)的狀態(tài)值。如果沒有必要保存狀態(tài)值,那么就可以復用棧幀,不會造成棧溢出。
舉例
這里以求n的階乘舉例:
正常遞歸:
假如n=3;那么每一步都需要保留n值以及下一步函數(shù)的返回值,所以每次調用都需要創(chuàng)建一個新的棧幀
尾遞歸:
假如n=3,這里每一次調用是可以復用棧幀的,因為不需要保存狀態(tài)值。
總結
所以說當遞歸是在當前棧幀執(zhí)行完之后,不需要再保留當前棧幀,而是帶著當前棧幀的結果,進入到下一棧幀,就可以優(yōu)化為尾遞歸,一般尾遞歸需要滿足遞歸調用是函數(shù)體中最后執(zhí)行的語句。比如階乘的例子中最后執(zhí)行的語句是直接調用factorial(n-1, n*result),而不是一個表達式n * factorial(n -1),如果是表達式的話就需要一個棧幀來保留n和factorial(n -1)的結果。
王垠的“40行代碼”真如他說的那么厲害嗎?
王大師已經變成孔乙己了,茴香豆的茴字有幾種寫法。來來回回這么多年了,以他的名氣和地位,沒做出一個有用的東西。基礎研究也沒見什么成果。是技術上沒見成績,商業(yè)上也沒有見成績。沒有一個安身立命的作品,太虛了。厲害,我只能說厲害,我看不懂。
Lisp值得去學習嗎?
謝謝邀請!
首先要說Lisp 是否值得學習那么要先知道Lisp到底是什么?
LISP,全名LIST Processor,即鏈表處理語言是一種計算機程序設計語言。由約翰·麥卡錫在1960年左右創(chuàng)造的一種基于λ演算的函數(shù)式編程語言。其創(chuàng)作背景為:1958年夏,來自麻省理工學院的人工智能研究先驅——約翰·麥卡錫參與IBM資訊研究部的工作,研究符號運算及應用需求。但當時IBM旗下的Fortran不要處理語言不能支援符號運算的遞歸、條件表達式、動態(tài)儲存分配及隱式回收等功能。于是在1958年秋回到麻省理工學院后,開展研發(fā)了表處理語言——LISP。
約翰·麥卡錫
LISP為函數(shù)式程序設計語言,所有運算都能以函數(shù)中用于參數(shù)的方式來實現(xiàn)。它的核心操作符只有七個操作符,這種簡潔的定義,非常接近圖靈機原型的純函數(shù)式語言,是現(xiàn)代語言完全無法比擬的。相對其優(yōu)點而言它的缺點也很明顯——其運算效率十分低下。原始定義簡潔的缺點使得大型開發(fā)工程變得困難。自底層到高層,自二維表查詢到面向對象,使用者需要嵌入更多的函數(shù)來實現(xiàn),致使LIPS眾多方言的衍生。
所以綜上所述,我認為,具體情況具體分析,合適的才是最好的。
什么是單向遞歸,尾遞歸?言簡意賅即可?
尾遞歸:程序中只有一句遞歸語句,且在末尾。單向遞歸:指程序中的遞歸語句,在本程序操作執(zhí)行前,都已經完成,如斐波那契數(shù)列。這樣一來,共同的特點是在化非遞歸時都沒有非要保存的分支路線