我正在处理一些我正在处理的代码。我需要程序取number (list-of-numbers)
并返回两者之间的最小值。到目前为止我有这个
(define (mini y lon)
(cond
[(empty? lon) y]
[else (min (first (foldr cons lon (list y))) (mini y (rest lon)))]))
我无法弄清楚它无法正常工作的原因。提前谢谢。
答案 0 :(得分:3)
解决方案过于复杂,为什么使用foldr
和min
,当一个简单的min
与apply
一起完成所有工作?试试这个:
(define (mini y lon)
(apply min y lon))
...或者您可以使用y
和lon
构建单个列表,但是再一次,您不需要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))