騙人的尾遞迴

2021-08-28 17:04:58 字數 408 閱讀 2007

看函式式程式設計的資料看到這個概念,

尾遞迴的定義

另外一片講概念的

看到最後那個快排的例子一頭霧水,然後發現有人和我有一樣的疑問,

關於快排的尾遞迴優化的例子的問題

然後,摸魚半天後,再回來看這個問題,突然領悟到尾遞迴 是指那個while, 而不是指while中的那個遞迴呼叫。.

經典 的 尾遞迴的例子,在c++中都是可以用while 來寫的(只用while,無需用stack這種輔助的資料結構)。 感覺尾遞迴只有在 函式式程式設計中才有用。

在快排的例子中,其實尾遞迴也並沒有對演算法的空間複雜度做很大的優化,因為遞迴的dfs性質,排序時堆疊的最大深度的平均值應該依然是 log(n), 最壞情況下最大深度也依然是n。

當然整個排序過程中的平均堆疊深度是有降低的,但是值得為了這點犧牲可讀性嗎?

遞迴 尾遞迴

階乘函式 n n n 1 n 2 3 2 1 針對這樣的表述,直譯成乙個過程 define factorial n if n 1 1 n factorial n 1 如果是factorial 6 其計算行為是 factorial 6 6 factorial 5 6 5 factorial 4 6 5...

遞迴 尾遞迴

計算n的階乘 function add n return n function add n 1 斐波那契數列 1 1 2 3 5 8 13.function arr n else 如上例項,但是遞迴有乙個很大的問題,就是在不斷地呼叫自身函式時,每一次呼叫都會存新的資料變數等,如果有成百上千次呼叫,則...

尾呼叫 尾遞迴

首先什麼是尾呼叫呢?我的理解是在,函式的最後呼叫乙個函式,並不包含該函式的任何變數。如 def f n return g n 複製 這個就是尾呼叫,尾呼叫的乙個好處就是,不用生成呼叫棧,因為假設是個尾呼叫,那麼當我執行到函式末尾的時候,這個函式相關的資訊我都可以不用保留了,因此不會出現棧溢位的問題。...