如何替换Scheme中嵌套列表中的元素

时间:2017-10-08 03:39:32

标签: scheme racket nested-lists

我想要一个这样的列表......

'((0 1 2) (3 4 5) (6 7 8) (0 3 6) (1 4 7) (2 5 8) (0 4 8) (2 4 6))

并替换所有出现的特定数字。

例如,在运行时

(replace 4 "x" '((0 1 2) (3 4 5) (6 7 8) (0 3 6) (1 4 7) (2 5 8) (0 4 8) (2 4 6)))

所需的输出是

'((0 1 2) (3 x 5) (6 7 8) (0 3 6) (1 x 7) (2 5 8) (0 x 8) (2 x 6)))

到目前为止我尝试过的是

(define (replace var player list) (if (null? list) '() (if (list? (car list)) (replace var player (cdr list)) (if (equal? var (car list)) (cons player (replace var player (cdr list))) (cons (car list) (replace var player (cdr list))) ))))

当我用x替换所有1时,输出为'(0 "x" 2)

1 个答案:

答案 0 :(得分:0)

你走在正确的轨道上,只有当第一个元素是一个列表本身时,你才会错过在(car lst)上实际应用该函数,即:

...
(if (list? (car list))
      (cons (replace var player (car list))         ;; missing this
            (replace var player (cdr list)))
      (if ...

另外,避免使用内置过程作为变量名(例如list),并且在使用条件时,不要嵌套多个if语句,而是使用cond或其亲属更好地转换为传统的if ... else if ... else ...想法。