![](/img/trans.png)
[英]Racket/Scheme - Replacing an item with another element in a non flat list
[英]Racket/Scheme - Replacing an element in a list based on a location
我試圖定義一個替換過程,它基本上與列表集做同樣的事情。 到目前為止,這是我的代碼:
(define replace
(lambda (s pos lst fin-lst)
(cond
((zero? pos) (cons (cons (reverse fin-lst) s) (rest lst)))
(else (replace s (- pos 1) (rest lst) (cons (first lst) fin-lst))))))
它有點像它應該做的那樣,但我正在努力讓輸出看起來像我想要的那樣。 例如這是我想要的結果
(replace 'a 2 '(1 2 3 4 5) '()) => '(1 2 a 4 5)
但截至目前,這就是我的程序返回的內容
'(((1 2) . a) 4 5)
我知道這是由於 cons 與 append,但我怎樣才能更改我的代碼以擺脫額外的括號和 . ?
你幾乎擁有它! reverse
調用放錯了地方,需要使用append
將兩個列表粘在一起。 這就是我的意思:
(define replace
(lambda (s pos lst fin-lst)
(cond
((zero? pos)
(append (reverse (cons s fin-lst)) (rest lst)))
(else
(replace s (- pos 1) (rest lst) (cons (first lst) fin-lst))))))
它按您的預期工作:
(replace 'a 2 '(1 2 3 4 5) '())
=> '(1 2 a 4 5)
嘗試這個:
(define replace
(lambda (l pos e)
((lambda (s) (s s l pos (lambda(x) x)))
(lambda (s l i col)
(if (null? l)
(col '())
(if (zero? i)
(col (cons e (cdr l)))
(s s (cdr l) (- i 1)
(lambda (r)
(col (cons (car l) r))))))))))
(replace '(a b c d e f) 2 'x)
(replace '(a b c d e f) 0 'x)
(replace '(a b c d e f) 20 'x)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.