本質上,尾遞歸函數不斷調用自己,直到它達到其結束條件。然而,與「常規」遞歸不同,它會傳遞中間答案給自己,直到達到最後。
一個例子是這樣的:
(define (find-length i lst)
(if
(null? lst) i
(find-length (+ i 1) (cdr lst))))
這個函數有兩個值:i
,追蹤列表的長度,到目前爲止,lst
,我們計算的元素列表。爲了所有的意圖和目的,我們的列表中的元素的運行計數是i
。因此,如果我們調用此方法,我們將要用i
將其初始化爲0.
首先我們檢查列表是否爲空。 (null?
)如果列表爲空,我們可以假設我們已經計算了所有元素,所以我們只返回i
,這是我們的運行計數。這是我們的最終狀態。
否則,我們再次撥打find-length
。但是,這一次,我們將i
加1,並從列表(cdr lst)
中刪除第一個元素。
例如,假設我們這樣調用該函數:
(find-length 0 (list 2 3 4 3 5 3))
我們評估,該計劃將遞歸調用:
(find-length 1 '(3 4 3 5 3))
(find-length 2 '(4 3 5 3))
(find-length 3 '(3 5 3))
(find-length 4 '(5 3))
(find-length 5 '(3))
(find-length 6 '()) ; end condition, return 6
This question適用於通用尾遞歸一個很好的參考。
http://stackoverflow.com/questions/33923/what-is-tail-recursion –