[英]Scheme R5RS, recursion or iterative?
我用2個函數編寫了一個方案代碼,該函數將參數加1,並從參數中減去1。 我現在已經編程了一個函數來自動執行此操作,但是我不知道它是遞歸還是迭代的。 這是整個代碼:
(define add1
(lambda (x)
(+ x 1)))
(define sub1
(lambda (x)
(- x 1)))
(define plus
(lambda (x y)
(if (zero? y)
x
(plus (add1 x) (sub1 y)))))
現在我的問題是,什么樣的功能是加的? 遞歸還是迭代,為什么?
隨着代碼的進行,它是一個遞歸過程。 但是,該過程是迭代的,因為它在尾部位置進行遞歸。
在Scheme中,您可以使用遞歸函數編寫迭代過程和遞歸過程。
例:
;; iterative process
;; recursive (inner) procedure
(define (fib n)
(define (fib n a b)
(if (zero? n)
a
(fib (- n 1) b (+ a b)))
(fib n 0 1))
;; recursive process
;; recursive procedure
(define (fib n)
(if (< n 2)
n
(+ (fib (- n 1))
(fib (- n 2)))))
您也可以使用循環構造編寫遞歸和迭代過程,盡管在Scheme中,此類循環構造實際上只是尾遞歸的語法糖。 為了能夠更深入地遞歸,它在其他語言中相當普遍。
例:
;; iterative process
;; iterative procedure (do)
(define (fib n)
(do ((n n (- n 1))
(a 0 b)
(b 1 (+ a b)))
((zero? n) a)))
;; recursive process
;; iterative procedure (do)
(define (fib n)
(let ((work (list n #f)))
;; push x-1 and x-2 onto work
(define (push-reduce! x)
(set! work
(cons (- x 1)
(cons (- x 2) work))))
;; pop top of work
(define (pop)
(let ((v (car work)))
(set! work (cdr work))
v))
;; find fibonacci with a iterative
;; (and ugly) do loop
(do ((n 0 (if (< c 2) (+ n c) (begin (push-reduce! c) n)))
(c (pop) (pop)))
((not c) n))))
最后一個是可怕的方案,應該避免,但是它非常用於避免其他語言中的堆棧溢出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.