如何将两个列表附加在一起?方案

时间:2019-05-19 01:52:27

标签: list append scheme lisp racket

我需要将两个列表合并在一起的帮助。我的目标是将"a"替换为"abc"。我已经做了一个计数器等,但是不知何故我无法追加这两个列表(列表是一个空列表,'("abc")是我要添加的新列表)。

我尝试添加更多的括号,但是添加的越多,问题只会变得越来越严重。

(define (umwandl tr)
  (cond ((null? tr) (display "Kein Text eingegeben"))
        (else (uff (string->list tr) '()))))  ; string wird nict inliste umgweandel

(define (uff tr liste)
  (cond ((null? tr)(list->string liste))
        (else 
           (cond ((equal? (first (rest (first (start1 (first tr))))) 1)
                    **((append list (list '("abc"))))))**
                    (uff (rest tr) liste))))

我的错误消息是('("abc"))不是自变量,或者只是给了我""作为答案。如果有人可以帮助,那就太好了!

1 个答案:

答案 0 :(得分:1)

学习计划或任何Lisp意味着要了解列表结构。可以像(1 2 3)那样创建列表(cons 1 (cons 2 (cons 3 '()))),我想认为列表中没有.的元素意味着有一个元素,而其余的元素则具有额外的一组括号。完成递归!因此:

'(1 2 3)              ; ==
'(1 . (2 3))          ; ==
'(1 . (2 . (3)))      ; ==
'(1 . (2 . (3 . ()))) ; ==> (1 2 3)

当我看到列表时,我看到了不存在的点,所以我知道3caddr,因为我经过. ( 2次(dd)然后跳了进入car,因此caddr。 同时添加两个列表意味着复制第一个列表,并用第二个列表替换()。因此append可以定义为:

(define (my-append l1 l2)
  (if (null? l1) 
      l2
      (cons (car l1) 
            (my-append (cdr l1) l2))))

将一个元素替换为另一个。您需要执行相同的操作,但要在每次迭代中比较第一个元素,然后根据该结果使用找到的元素或替换元素。如果要比较字符串,则需要使用equal?,因为(eqv? "hello" "hello") ; ==> #f是有效的结果。