Умножение списка предметов на определенное число "х"
Как бы вы написали процедуру, которая умножает каждый элемент списка на заданное число (x). Если я даю список '(1 2 3) и x=3, процедура должна вернуться (3 6 9)
Моя попытка:
(define (mul-list list x)
(if (null? list)
1
(list(* x (car list))(mul-list (cdr list)))))
Приведенный выше код не работает. Какие изменения я должен сделать? Пожалуйста помоги
Заранее спасибо.
2 ответа
Это пример учебника, где вы должны использовать map
вместо того, чтобы изобретать велосипед:
(define (mul-list lst x)
(map (lambda (n) (* x n)) lst))
Но я думаю, что вы хотите реализовать это с нуля. Ваш код имеет следующие проблемы:
- Вы не должны звонить
list
параметр, который конфликтует со встроенной процедурой с тем же именем - тот, который вы сейчас пытаетесь использовать! - Базовый случай должен вернуть пустой список, учитывая, что мы строим список в качестве вывода
- Мы строим списки
cons
элементы, не вызываяlist
- Вы забыли передать второй параметр в рекурсивный вызов
mul-list
Это должно исправить все ошибки:
(define (mul-list lst x)
(if (null? lst)
'()
(cons (* x (car lst))
(mul-list (cdr lst) x))))
В любом случае, это работает как ожидалось:
(mul-list '(1 2 3) 3)
=> '(3 6 9)
Для и его расширения (для *, для / списка, для / первого, для / последнего, для / суммы, для / продукта, для / и, для / или т.д.: https://docs.racket-lang.org/reference/for.html) очень полезны для циклов в Racket:
(define (ml2 lst x)
(for/list ((item lst))
(* item x)))
Тестирование:
(ml2 '(1 2 3) 3)
Выход:
'(3 6 9)
Я обнаружил, что во многих случаях реализация for обеспечивает короткий, простой и легко понятный код.