[英]Tail recursive functions in Scheme
我正在為聖誕節考試而學習,並做了一些樣本考試題,我碰到了一個讓我有些困惑的問題
我可以進行常規的遞歸,但是我無法用尾巴遞歸來寫同樣的東西。
普通版:
(define (factorial X)
(cond
((eqv? X 1) 1)
((number? X)(* X (factorial (- X 1))))))
要使函數尾部遞歸,在函數返回后,除返回其值外,無需執行任何其他操作。 也就是說,在遞歸步驟中發生的最后一件事是對函數本身的調用。 這通常是通過使用累加器參數跟蹤答案來實現的:
(define (factorial x acc)
(if (zero? x)
acc
(factorial (sub1 x) (* x acc))))
上面的過程將首先以1
作為累加器來調用,如下所示:
(factorial 10 1)
=> 3628800
注意,當達到基本情況時,將返回累加值,並且在遞歸調用的每個點上更新acc
參數。 我必須在過程中添加一個額外的參數,但是可以通過定義內部過程或命名的let
來避免這種情況,例如:
(define (factorial x)
(let loop ((x x)
(acc 1))
(if (zero? x)
acc
(loop (sub1 x) (* x acc)))))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.