2015-11-15 3 views
2

Мне нужно использовать 2 функции ниже, чтобы узнать минимальное значение в списке после возведения в квадрат каждого элемента.(Схема) Используя пользовательскую карту и уменьшите, найдите минимальное значение в списке

Например: (minSquare '(10 -2 5 9 -11) должен распечатать 4.


карты и уменьшить код:

(define map 
    (lambda (f l) 
    (if (null? l) 
     '() 
     (cons (f (car l)) (map f (cdr l)))))) 

(define reduce 
    (lambda (op l id) 
    (if (null? l) 
     id 
     (op (car l) (reduce op (cdr l) id))))) 

Я попытался это:

(define minSquare 
    (lambda (x) 
    (cond [(null? x) '()] 
      [else (map minSquare (reduce * x (car x))) (minSquare (cdr x))]))) 

Но проходит все числа в список, умноженный на их квадраты, на map, затем сбой, дающий contract violation. Я не уверен, как использовать эти две функции.

Если кто-то может вести меня через него (не дать ответа), я был бы очень признателен!

ПРИМЕЧАНИЕ: Я не могу изменить map или reduce.

+1

Возможно, вы захотите сделать это за два прохода: (1) соберите все элементы в списке, затем (2) найдите наименьший элемент. –

+0

@AlexisKing Да, это было мое мнение, но я не могу понять, как это сделать. Я попытался передать первый элемент списка 'reduce' с помощью' * 'оператора и' (car l) 'для id. Я надеялся, что это будет делать -5 * -5, но я просто получаю сообщение о том, что он ожидает пару. Я не могу изменить карту или уменьшить ее. – Vylic

ответ

2

Сначала вы должны map над списком возведения в квадрат каждого элемента, и после что найти минимум, используя reduce. Некоторые подсказки:

  • reduce получает три параметра, первое это процедура, которая сравнивает каждый элемент с начальным минимальным, обновляет свою ценность всякий раз, когда мы находим элемент, который меньше, чем текущий минимум.
  • Второй параметр - это список для перемещения, который в этом случае является результатом возведения в квадрат каждого из элементов: (map (lambda (n) (* n n)) x).
  • Третий параметр - это начальное минимальное значение, в данном случае это число, такое, что все остальные будут меньше, например, положительная бесконечность +inf.0.

Обратите внимание, что использование reduce здесь немного излишним, учитывая, что язык уже дает нам min функции.

+0

Можете ли вы объяснить сокращение? Я думал, что это просто какая-то математическая операция в списке, и идентификатор прошел. Например: '(reduce * '(1 2 3 4 5) 2)' вернет '240', потому что он делает' (1 * 2 * 3 * 4 * 5) * 2'. То, что вы говорите, немного другое. Я использую это неправильно? Я хотел бы использовать функцию 'min', но поскольку это назначение, я должен использовать как' map', так и 'reduce'. – Vylic

+0

Итак, я думаю, я понимаю это немного лучше. Я сделал '(уменьшите <(команда карты там) + inf.0)'. Однако это дает мне ошибку, говоря «<нарушение контракта». Что я делаю не так? – Vylic

+1

@ Vylic вы попросили _hints_, а не для полного решения. Если вы хотите понять «уменьшить», взгляните на [документацию] (http://docs.racket-lang.org/reference/pairs.html#%28def._%28%28lib._racket%2Fprivate%2Flist ..rkt% 29._foldl% 29% 29) - это не просто для выполнения математических операций, он расходует список и дает результат. –