【问题标题】:SICP/Scheme: Procedure that accepts a list of pairs and an element, returns a list of pairsSICP/Scheme:接受对列表和元素的过程,返回对列表
【发布时间】:2019-04-13 18:39:54
【问题描述】:

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

问题是: 制作一个过程元素计数,它采用对“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】:

    您已经非常接近正确的解决方案了;我认为对于列表和对的定义方式存在一些混淆。这是 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 被定义为您传入两个列表,并将它们组合成一个新列表。这就是为什么第二个参数是一个包含您要附加​​的对的列表。

    【讨论】:

      猜你喜欢
      • 2021-11-12
      • 1970-01-01
      • 2018-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-21
      • 2011-08-16
      相关资源
      最近更新 更多