我有以下列表:
(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)
我真的不认为你应该就地改变数据,所以我会选择我的第一个建议的解决方案,这是惯用的解决方案。