下面提到的伪代码的任何尾递归版本?谢谢 !
(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)))))