下面提到的伪代码的任何尾递归版本?谢谢 !
(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)))))
您应该阅读fold
高阶函数。
定义一个辅助函数,它接受一个列表和到目前为止找到的最小元素(我们称之为 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)))))