分别计算每个子列表的匹配数
Calculating the number of matches for every sublist separately
这是我的带有子列表的大列表:
(define family
(list
(list 'Daddy 't-shirt 'raincoat 'sunglasses 'pants 'coat 'sneakers)
(list 'Mamma 'high-heels 'dress 'pants 'sunglasses 'scarf)
(list 'son 'pants 'sunglasses 'sneakers 't-shirt 'jacket)
(list 'daughter 'bikini 'Leggings 'sneakers 'blouse 'top)))
我想将 family
与这个简单列表进行比较:
(list 'sneakers 'dress 'pants 'sunglasses 'scarf)
每个匹配应该给 1 分,我希望为每个子列表单独计算该分。
代码如下:
;检查一个元素是否存在于列表中
(define occurs?
(lambda (element lst)
(cond
[(and (null? element) (null? lst))]
[(null? lst) #f]
[(pair? lst)
(if
(occurs? element (car lst)) #t
(occurs? element (cdr lst)))]
[else (eqv? element lst)])))
;--------------------------------------
;创建了一个仅包含名称的列表。
(define (name-list lst)
(list (map car lst)))
;每个子列表都有一个名称(子列表的汽车)。每个子列表的名称列表变成点列表。除了下面的代码之外,我的所有代码都按我想要的方式运行。问题出在 point-list
代码中。
(define (point lst db)
(let ((no-point (name-list db)))
(cond ((or (null? lst) (null? db)) '())
(set! (first no-point) (comp lst (rest db)))
(else (point lst (cdr db))))))
Daddy-sublist 有 3 个共同点。 Mamma-sublist 共有 4 个元素,son-sublist 有 3 个元素,daugther-sublist 有 1 个元素。
我希望输出数据是这样的:
> (comparison (list 'sneakers 'dress 'pants 'sunglasses 'scarf) family)
'(3 4 3 1)
我的代码无法正常运行。我得到这个错误:
set!: bad syntax in: set!
有人指导可以告诉我该怎么做吗?
你的 set!
语法错误:
(set! (first no-point-lst) (comparison lst (rest db)))
这是对 set!
的无效使用,试图 "mutate the structure" 列表 no-point-lst
,更改其第一个中实际包含的内容位置。
set!
做不到。它可用于更改绑定,即变量的值:(let ((a 1)) (set! a 2))
。
他们可以在 Common Lisp 中编写 (setf (first list) newval)
,但不能在 Scheme / Racket 中编写。
如果这对你的算法很重要,你可以在 R5RS Scheme 中使用 set-car!
,或者在 Racket 中使用 set-mcar!
。或者您可以使用 vectors.
但您也可以将代码重组为
(set! no-points-list
(cons
(comparison lst (rest db))
(cdr no-points-list)))
这是我的带有子列表的大列表:
(define family
(list
(list 'Daddy 't-shirt 'raincoat 'sunglasses 'pants 'coat 'sneakers)
(list 'Mamma 'high-heels 'dress 'pants 'sunglasses 'scarf)
(list 'son 'pants 'sunglasses 'sneakers 't-shirt 'jacket)
(list 'daughter 'bikini 'Leggings 'sneakers 'blouse 'top)))
我想将 family
与这个简单列表进行比较:
(list 'sneakers 'dress 'pants 'sunglasses 'scarf)
每个匹配应该给 1 分,我希望为每个子列表单独计算该分。
代码如下:
;检查一个元素是否存在于列表中
(define occurs?
(lambda (element lst)
(cond
[(and (null? element) (null? lst))]
[(null? lst) #f]
[(pair? lst)
(if
(occurs? element (car lst)) #t
(occurs? element (cdr lst)))]
[else (eqv? element lst)])))
;--------------------------------------
;创建了一个仅包含名称的列表。
(define (name-list lst)
(list (map car lst)))
;每个子列表都有一个名称(子列表的汽车)。每个子列表的名称列表变成点列表。除了下面的代码之外,我的所有代码都按我想要的方式运行。问题出在 point-list
代码中。
(define (point lst db)
(let ((no-point (name-list db)))
(cond ((or (null? lst) (null? db)) '())
(set! (first no-point) (comp lst (rest db)))
(else (point lst (cdr db))))))
Daddy-sublist 有 3 个共同点。 Mamma-sublist 共有 4 个元素,son-sublist 有 3 个元素,daugther-sublist 有 1 个元素。
我希望输出数据是这样的:
> (comparison (list 'sneakers 'dress 'pants 'sunglasses 'scarf) family)
'(3 4 3 1)
我的代码无法正常运行。我得到这个错误:
set!: bad syntax in: set!
有人指导可以告诉我该怎么做吗?
你的 set!
语法错误:
(set! (first no-point-lst) (comparison lst (rest db)))
这是对 set!
的无效使用,试图 "mutate the structure" 列表 no-point-lst
,更改其第一个中实际包含的内容位置。
set!
做不到。它可用于更改绑定,即变量的值:(let ((a 1)) (set! a 2))
。
他们可以在 Common Lisp 中编写 (setf (first list) newval)
,但不能在 Scheme / Racket 中编写。
如果这对你的算法很重要,你可以在 R5RS Scheme 中使用 set-car!
,或者在 Racket 中使用 set-mcar!
。或者您可以使用 vectors.
但您也可以将代码重组为
(set! no-points-list
(cons
(comparison lst (rest db))
(cdr no-points-list)))