코드가 진행되면서 재귀 적 절차가 진행됩니다. 그러나 프로세스는 꼬리 위치에서 재귀를 수행하므로 반복됩니다.
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)))))
계획 이러한 루프 구조가 꼬리 재귀 정말 그냥 문법 설탕은 비록 또한, 루프 구조와 재귀와 반복 두 프로세스를 작성할 수 있습니다. 더 많이 재귀 할 수 있기 위해서는 다른 언어에서도 그렇습니다.
예 :
이
;; 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))))
마지막 하나는 피해야한다 단순히 끔찍한 계획이지만, 꽤 많은 다른 언어 스택 오버 플로우를 방지하기 위해 사용됩니다.