尾端遞迴是一種編程技巧。遞迴函式是指一些會在函式內呼叫自己的函式,如果在遞歸函式中,遞歸調用返回的結果總被直接返回,則稱為尾部遞歸。尾部遞歸的函式有助將算法轉化成函式程式語言,而且從編譯器角度來說,亦容易最佳化成為普通迴圈。這是因為從電腦的基本面來說,所有的迴圈都是利用重複移跳到代碼的開頭來實現的。如果有尾部歸遞,就只需要疊套一個堆疊,因為電腦只需要將函式的參數改變再重新呼叫一次。利用尾部遞歸最主要的目的是要最佳化,例如在Scheme語言中,明確規定必須針對尾部遞歸作最佳化。可見尾部遞歸的作用,是非常依賴於具體實作的。
實例
通常被用於解釋遞迴的程式是計算階乘。以下計算階乘的Scheme程式不是尾端遞迴,而只是一般遞迴: Cite book
編著: Harold Abelson and Gerald Jay Sussman with Julie Sussman
title=Structure and Interpretation of Computer Programs
location=Cambridge, MA
出版: MIT Press
date=1996 |ISBN=0-262-01153-0
時間: 2011
(define (factorial n)
(if (=n 1)
1
(* n (factorial (- n 1)))))
</source> 因此,如果呼叫factorial時的參數n足夠大,這一程式會出現堆疊溢位。然而,如果將同一程式寫作尾端遞迴,按Scheme的標準將不會出現溢位:
(define (factorial n)
(define (iter product counter)
(if (> counter n)
product
(iter (* counter product)
(+ counter 1))))
(iter 1 1))
在第二個程式中,注意iter函式直接返回其遞迴呼叫,而沒有對其進行運算。因此,這是一個尾端遞迴。