簡體   English   中英

方案R5RS是遞歸還是迭代?

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

現在我的問題是,什么樣的功能是加的? 遞歸還是迭代,為什么?

從語法上講, plus函數是遞歸的:顯然,它是在調用自身。 有趣的問題是:它生成什么樣的過程 鑒於它是以尾部遞歸的方式編寫的(直覺上:在遞歸調用之后沒有任何事情要做),我們可以說它生成的過程是迭代的。 有關程序及其生成過程的更詳細討論,請參閱SICP

隨着代碼的進行,它是一個遞歸過程。 但是,該過程是迭代的,因為它在尾部位置進行遞歸。

在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.

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