Умножение списка предметов на определенное число "х"

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

Другие вопросы по тегам