从将其对数除以另一个数字的列表创建一个虚线对列表



我有以下列表:

(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:需要一个列表。

我该怎么做?

这比看起来要棘手一些。您需要创建一个新对,因为(通常(您无法修改现有对,无论如何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)

我真的不认为你应该就地改变数据,所以我会选择我的第一个建议的解决方案,这是惯用的解决方案。

最新更新