下面提到的伪代码的任何尾递归版本?谢谢 !计划。尾递归?
(define (min list)
(cond
((null? list) '())
((null? (cdr list)) (car list))
(#t (let ((a (car list))
(b (min (cdr list))))
(if (< b a) b a)))))
下面提到的伪代码的任何尾递归版本?谢谢 !计划。尾递归?
(define (min list)
(cond
((null? list) '())
((null? (cdr list)) (car list))
(#t (let ((a (car list))
(b (min (cdr list))))
(if (< b a) b a)))))
在Scheme中,SRFI 1提供'fold'(http://srfi.schemers.org/srfi-1/srfi-1.html)。如果您使用PLT,请说'(require srfi/1)'。如果使用Guile,请说'(use-modules(srfi srfi-1))'。对于其他实现,请阅读各自的手册。 :-) – 2010-04-26 04:49:33
定义一个帮助函数,它带有一个列表和迄今为止找到的最小元素(我们称之为b)。如果列表为空,则应返回b,否则如果列表(a)的头部小于b,则应返回(helper (cdr list) a)
,否则返回(helper (cdr list) b)
。现在我们可以将(min list)
定义为(helper (cdr list) (car list))
。
(define (min list)
(let imin ((l (cdr list))
(m (car list)))
(cond
((null? l) m)
(else
(let ((a (car l)))
(imin (cdr l)
(if (< a m) a m)))))))
(define (min ns)
(let loop ((ns-left ns) (min-so-far maxint))
(if (null? ns-left)
min-so-far
(loop
(cdr ns-left)
(if (< (car ns-left) min-so-far)
(car ns-left)
min-so-far)))))
(define (min list)
(min-helper list #f))
(define (min-helper list min-so-far)
(if (null? list)
min-so-far
(let ((m (car list)))
(if (eq? min-so-far #f)
(set! min-so-far m))
(if (< m min-so-far)
(min-helper (cdr list) m)
(min-helper (cdr list) min-so-far)))))
这里有一个扰流板:http://inferretuation.blogspot.com/2008/05/lists-and-lists-tail-recursive-fun.html如果这是家庭作业,你在您提交自己的答案之前可能不想阅读它! – 2010-04-26 04:55:38