SICP/Scheme:接受一个对列表和一个元素的过程,returns一个对列表
SICP/Scheme: Procedure that accepts a list of pairs and an element, returns a list of pairs
我遇到了这个问题。这不是作业,其实是我在考试中遇到的一道题,为了加深理解,我想成功解决。
问题是:
制作一个过程元素计数,它采用对列表 "lst" 和元素 "el" 和 returns 对列表,其中,如果元素 "el" 存在于 "lst"作为第一个成员,然后第二个成员增加1。否则我们在"lst"的末尾添加一对(cons el 1)。
想要的输出:element-count '((a 2)) b) -> '((a 2 (b 1))
到目前为止我的代码是这样的:
#lang sicp
(define (append list1 list2)
(if (null? list1)
list2
(cons (car list1) (append (cdr list1) list2))))
(define (count-element lst el)
(cond ((eq? (car lst) el) (+ (cdr lst) 1))
(else (append lst (cons (el 1))))))
我遇到的第一个问题是它告诉我 "b" 未定义。显然,不需要定义 b,因为我希望它出现在我的输出中。我应该如何解决这个问题?我工作的环境是 DrRacket。
主要问题是我应该如何定义对列表?或者我的代码真的没问题吗?列表和配对对我来说仍然很混乱,所以对于愚蠢的问题我深表歉意。
您非常接近正确的解决方案;我认为关于列表和对的定义方式存在一些混淆。这是 count-element
的实现和用法,可以满足您的需求:
(define (count-element lst el)
(cond ((eq? (car lst) el) (+ (cdr lst) 1))
(else (append lst (list (cons el 1))))))
(count-element (list (cons 'a 2)) 'b)
有两点需要注意。
首先,定义pair列表的方式是这样的:
(list (cons 'a 1) (cons 'c 2))
或
'((a . 1) (c . 2))
其次,这是使用你的append
方法的正确方法:
(append lst (list (cons 'b 1)))
或
(append lst '((b . 1)))
那是因为 append
的定义是让您传入两个列表,并将它们组合成一个新列表。这就是为什么第二个参数是一个列表,其中包含您要附加的对。
我遇到了这个问题。这不是作业,其实是我在考试中遇到的一道题,为了加深理解,我想成功解决。
问题是: 制作一个过程元素计数,它采用对列表 "lst" 和元素 "el" 和 returns 对列表,其中,如果元素 "el" 存在于 "lst"作为第一个成员,然后第二个成员增加1。否则我们在"lst"的末尾添加一对(cons el 1)。 想要的输出:element-count '((a 2)) b) -> '((a 2 (b 1))
到目前为止我的代码是这样的:
#lang sicp
(define (append list1 list2)
(if (null? list1)
list2
(cons (car list1) (append (cdr list1) list2))))
(define (count-element lst el)
(cond ((eq? (car lst) el) (+ (cdr lst) 1))
(else (append lst (cons (el 1))))))
我遇到的第一个问题是它告诉我 "b" 未定义。显然,不需要定义 b,因为我希望它出现在我的输出中。我应该如何解决这个问题?我工作的环境是 DrRacket。 主要问题是我应该如何定义对列表?或者我的代码真的没问题吗?列表和配对对我来说仍然很混乱,所以对于愚蠢的问题我深表歉意。
您非常接近正确的解决方案;我认为关于列表和对的定义方式存在一些混淆。这是 count-element
的实现和用法,可以满足您的需求:
(define (count-element lst el)
(cond ((eq? (car lst) el) (+ (cdr lst) 1))
(else (append lst (list (cons el 1))))))
(count-element (list (cons 'a 2)) 'b)
有两点需要注意。
首先,定义pair列表的方式是这样的:
(list (cons 'a 1) (cons 'c 2))
或
'((a . 1) (c . 2))
其次,这是使用你的append
方法的正确方法:
(append lst (list (cons 'b 1)))
或
(append lst '((b . 1)))
那是因为 append
的定义是让您传入两个列表,并将它们组合成一个新列表。这就是为什么第二个参数是一个列表,其中包含您要附加的对。