簡體   English   中英

Scheme中的尾遞歸函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM