0

我正在编写一个函数replaceFirst(X Y L),它仅将列表 L 中第一次出现的 X 替换为 Y。

这是我到目前为止所做的:

(define replaceFirst( lambda (X Y L)
    (cond
        ( (null? L)             '() )
        ( (equal? (car L) X)    (set! Y (cdr L)) )
        ( #t                    (replaceFirst X Y (cdr L)) )
    )
))

这给出了一个错误In procedure setter: Wrong type argument in position 1: #<procedure car (_)>

编辑

我想出了一个解决方案:

首先,如果X是第一个元素,而不是使用set!(我不熟悉),我cons Y将列表排除在外X

否则,我cons将列表的第一个元素与列表的其余部分递归调用的函数。

(define replaceFirst( lambda (X Y L)
    (cond
        ( (null? L)             '() )
        ( (equal? (car L) X)    (cons Y (cdr L)) )
        ( #t                    (cons (car L) (replaceFirst X Y (cdr L))) )
    )
))
4

1 回答 1

0

在你条款中:

( (equal? (car L) X)    (set! Y (cdr L)) )

该函数实际返回什么?如果 Y 应该是 X 的替代品,一旦你知道(car L)等于X,那么将变量 Y 的值设置为列表的其余部分对你有什么好处?

您的更新很好,但请注意,它会返回一个类似 L 的列表,但其中第一次出现的 X 已被 Y 替换。它不是同一个列表。这可能没问题,但是使用set! 在您的第一次尝试中表明您可能想修改作为输入传入的列表。

于 2016-03-31T14:20:21.767 回答