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

问题描述 投票:2回答:1

我遇到过这个问题,我遇到了一些问题。这不是家庭作业,它实际上是我在测试中遇到的一个问题,加深了我的理解,我想成功地解决它。

问题是:制作一个过程元素计数,它取一对“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。主要问题是我应该如何定义对列表?或者我的代码真的没问题吗?列表和配对对我来说仍然很混乱,所以我为愚蠢的问题道歉。

list append scheme racket sicp
1个回答
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以便传入两个列表,并将它们组合成一个新列表。这就是为什么第二个参数是包含您要追加的对的列表。

© www.soinside.com 2019 - 2024. All rights reserved.