Создайте пунктирный список пар из списка, разделяющего его пары по номерам - PullRequest
0 голосов
/ 18 октября 2018

У меня есть следующий список:

(define lista '((a . 1) (b . 2) (c . 3)))

Я хочу разделить каждое из чисел в парах (1, 2 и 3) на другое число в следующей переменной:

(define sum 6)

И я хочу изменить этот результат на каждую пару, чтобы получить такой список:

'((a . 1.66667) (b . 0.33333) (c . 0.5)))

Я пробовал следующие предложения:

(map / cdr lista sum)

и

(map / (cdr lista) sum)

и

(map / (map cdr lista) sum)

Но во всех случаях возникает проблема с параметром sum в функции map: ожидается список.

Как я могу это сделать

1 Ответ

0 голосов
/ 18 октября 2018

Это немного сложнее, чем кажется.Вам необходимо создать новую пару, поскольку (как правило) вы не можете изменить существующую пару, и в любом случае map возвращает новый список:

; returns a new list
#lang racket
(map (lambda (p) (cons (car p) (/ (cdr p) sum)))
     lista)

В случае, если вы предполагаете изменить существующие пары с помощьюset-cdr!, тогда вы должны использовать for-each вместо map и перейти на язык, который поддерживает парную мутацию:

; modifies list in-place
#lang r5rs
(for-each (lambda (p) (set-cdr! p (/ (cdr p) sum)))
          lista)

Я не думаю, что вы должны изменять данные веще нет, так что я бы пошел с моим первым предложенным решением, которое является идиоматическим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...