SICP / Scheme:接受对列表和一个元素,返回对列表的过程

时间:2019-04-13 18:39:54

标签: list append scheme racket sicp

我遇到了一些与此问题有关的问题。这不是作业,实际上是我在测试中遇到的问题,加深我的理解,我想成功解决它。

问题是: 生成一个过程element-count,该过程接受一对“ lst”和一个元素“ el”的列表,并返回一个对的列表,其中,如果元素“ 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。 主要问题是如何定义对列表?还是我的代码真的可以吗?列表和配对仍然让我感到困惑,因此我为愚蠢的问题表示歉意。

1 个答案:

答案 0 :(得分:3)

您已接近正确的解决方案;我认为列表和对的定义方式有些混乱。这是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)

有两件事要注意。

首先,定义配对列表的方式如下:

(list (cons 'a 1) (cons 'c 2))

'((a . 1) (c . 2))

第二,这是使用append方法的正确方法:

(append lst (list (cons 'b 1)))

(append lst '((b . 1)))

这是因为定义了append以便您传递两个列表,并将它们组合成一个新列表。这就是为什么第二个参数是包含要添加的对的列表的原因。