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