簡體   English   中英

Racket/Scheme - 根據位置替換列表中的元素

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM