列表和数字之间的最小值

时间:2013-11-15 14:35:31

标签: scheme lisp racket

我正在处理一些我正在处理的代码。我需要程序取number (list-of-numbers)并返回两者之间的最小值。到目前为止我有这个

(define (mini y lon)
 (cond
  [(empty? lon) y]
  [else (min (first (foldr cons lon (list y))) (mini y (rest lon)))]))

我无法弄清楚它无法正常工作的原因。提前谢谢。

2 个答案:

答案 0 :(得分:3)

解决方案过于复杂,为什么使用foldrmin,当一个简单的minapply一起完成所有工作?试试这个:

(define (mini y lon)
  (apply min y lon))

...或者您可以使用ylon构建单个列表,但是再一次,您不需要foldr,简单的cons是你想要的只是:

(define (mini y lon)
  (apply min (cons y lon)))

...但如果你确实需要使用foldl(或foldr),那么就不需要使用min,诀窍就是传递正确的功能:

(define (mini y lon)
  (foldl (lambda (e a) (if (< e a) e a)) ; foldr will also work
         y
         lon))

...或者您可以使用min,以获得更短的解决方案。有很多方法可以解决这个问题!

(define (mini y lon)
  (foldl min y lon)) ; foldr will also work

答案 1 :(得分:3)

对于racket解决方案,我认为Óscar nailed it,但由于您标记了完全不同的语言 Scheme Lisp ,因此我制作了som解决方案以适应这些标签也是如此。

使用fold-left

中的原生(rnrs lists)的R6RS解决方案
#!r6rs ; #!r7rs
(import (rnrs base) (rnrs lists)) ; (import (scheme base))

(define (mini x xs)
  (fold-left min x xs))

;; without fold
(define (mini-simple x xs)
  (apply min x xs))

由于您标记了lisp,因此这是Common Lisp版本。 CL没有foldl/foldr,但reduce替换了两者以上:

(defun mini (x xs)
  (reduce #'min xs :initial-value x))