List 替换列表中第一个出现的元素
我正在编写一个函数List 替换列表中第一个出现的元素,list,functional-programming,scheme,lisp,sisc,List,Functional Programming,Scheme,Lisp,Sisc,我正在编写一个函数replaceFirst(xyl),它只将列表L中第一个出现的X替换为Y 以下是我迄今为止所做的工作: (define replaceFirst( lambda (X Y L) (cond ( (null? L) '() ) ( (equal? (car L) X) (set! Y (cdr L)) ) ( #t (replaceFirst X Y (cd
replaceFirst(xyl)
,它只将列表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)) )
)
))
这在过程设置器中给出了一个错误:位置1的错误类型参数:#
编辑
我想出了一个解决办法:
首先,如果X
是第一个元素,而不是使用set代码>(我不熟悉),我将cons
Y
添加到列表中,不包括X
否则,Icons
列表的第一个元素,其函数在列表的其余部分递归调用
(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))) )
)
))
在你的条款中:
( (equal? (car L) X) (set! Y (cdr L)) )
函数实际返回什么?如果Y被认为是X的替代,一旦你知道(car L)等于X,那么将变量Y的值设置为列表的其余部分会对你有什么帮助呢
您的更新很好,但请注意,它返回一个新列表,如L,但其中第一次出现的X已被Y替换。它不是同一个列表。这可能很好,但是使用set在您的第一次尝试中,建议您可能想要修改作为输入传入的列表。新列表并不重要。回顾我的第一个解决方案,我发现它是多么糟糕!我现在正试图编写一个函数,用Y替换L中最后出现的X,这要困难得多。任何关于从何处开始的提示都将不胜感激。@KOB一个简单的解决方案就是(定义(替换最后一个XYLST)(反向(替换第一个XY(反向lst)))
。