2013-11-15 3 views
0

У меня возникают некоторые сложности с частью кода, над которой я работаю. Мне нужна процедура, чтобы принять 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

Решение слишком сложен, поэтому использование 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 
+0

Я думал об этом, как хорошо, но, к сожалению, мы должны использовать foldr или foldl. –

+0

Вы должны указать, что в вопросе, в противном случае нет смысла использовать сгиб здесь –

+0

Спасибо, я сделал обходное решение, выполнив ваше решение и придумал следующее: '(define (mini y lon)' '(cond' ' [(empty? lon) y] ' ' [else (применить min (foldr cons lon (list y)))])) ' Редактировать: Ничего себе, это еще лучше и правильно сделать это. Спасибо! –

3

Я думаю Óscar nailed it для racket решения, но так как вы помечены на cmpletely разных языках Scheme и Лиспа Я сделал сом решение, чтобы соответствовать этим тегам, а также.

R6RS-решение с использованием нативного fold-left из (rnrs lists)

#!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)) 
Смежные вопросы