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