1

底部代码是从排序列表 L 中删除相邻的重复元素。

(define a
  (lambda (L)
    (cond
       ((null? L) L)
       ((null? (cdr L)) L)
       ((eqv? (car L) (car (cdr L))) (a (cdr L)))
       (else (cons (car L) (a (cdr L)))))))

问题是“编写一个类似的函数,使用 Scheme 的命令式特性来修改 L '就地',而不是构建一个新列表。在简洁性、概念清晰性和速度方面将其与上面的代码进行比较。

但我不清楚什么是必要的功能。请帮忙。

4

1 回答 1

1

该问题要求您使用以下部分或全部过程来编写解决方案set-car! , set-cdr!,set!等。 place”,意思是:不创建新列表,而是直接修改作为参数传递的列表。

请注意,所有提到的过程名称都以!(发音:bang!)结尾,这是为了警告程序员他们将更改作为参数接收的对象。将此与您迄今为止一直在使用的过程进行对比,它不会更改对象,并且在必要时将返回一个具有请求修改的新对象 - 一种函数式编程风格,与您开始时会发生的命令式编程风格不同使用 bang! 程序。

看看SICP 书中的3.3 Modeling with Mutable Data部分,它将详细解释如何处理改变数据的操作。

于 2013-04-07T18:55:39.623 回答