2012-11-13 28 views
11

Olası Çoğalt: lisp birçok öğreticiler izliyor ve cevapları için google yüksek ve düşük arama yaptıktan sonra
what is the ‘cons’ to add an item to the end of the list?LISP'de listenin sonuna ekleme

, hala çözemiyorum LISP'de bir listenin sonuna nasıl eklenir.

İşlevimin '(b c d) listesinin sonuna 'a eklemek istiyorum, ancak yalnızca nasıl ekleyeceğimi biliyorum. Birisi listenin sonunda 'a eklemek için doğru şekilde bana yardımcı olabilir miyim? İşte benim kodum. Şimdiden teşekkürler.

(defun AddRt (a list) 
    (cond 
    ((null list) 
     0) 
    (t 
     (princ (cons a (cons (car list) (cdr list)))) 
    ))) 


(AddRt 'a '(b c d)) 

cevap

5

Yinelemeli bir işlev kullanabilirsiniz. Ayrıca, içinde prens kullanmaktan kaçınmalısınız. değeri sonunda ilave edilmesi dışında

İzleyen fonksiyon, endcons, cons tam olarak aynı şeyi yapar.

(defun endcons (a v) 
    (if (null v) (cons a nil) (cons (car v) (endcons a (cdr v))))) 

(endcons 'a '(b c d)) 

Tabii ki, aynı zamanda eklemek kullanabilirsiniz: what is the 'cons' to add an item to the end of the list?

+0

Eğer aslını kullanmazsam, çıktıya nasıl geçmeliyim (endcons 'a' (b c d)) ekrana? Yardımın için teşekkürler. – Bert

+0

Daha sonra, örneğin, ((endcons 'a' (b c d))) '). Bazı işler ve çıktıyı aynı anda yapan bir işlevi tanımlamak her zaman kötü bir fikirdir: Eğer birçok kez kullanmak istiyorsanız ve binlerce çöp kutusuyla sinirlenmek istemiyorsanız ne olacak? Daima «gerçek iş» ve IO'yu ayırın. –

4

bir yolu listesini tersine çevirmek için geçerli:

(append '(b c d) '(a)) 

de bu ilgili soruya bakın. Öğeyi, tersine çevrilmiş listenin başına ekleyin. Ve sonunda tüm listeyi tersine çevir.

Şema kodu:

(define (add-to-tail l x) 
    (reverse (cons x (reverse l))) 

Ama bu sık sık gereken bir işlem olup olmadığını, o zaman (tek bağlantılı) listelerin dışında bir veri yapısını bulmak öneririm

.

+0

Teşekkürler, bunu da deneyeceğim. – Bert

+1

Bunun iyi bir yaklaşım olmadığına inanıyorum: 2 ters yineleme yapıyorsunuz, bu da büyük bir liste numarasına uzun sürebilir. –

+1

Bu iyi bir nokta.Uzun bir liste için, son çifti değiştirmek daha iyi olabilir. OP dili belirtmedi. Değişmez (tek bağlantılı) listeleri olan bir dilde, ters-iki yöntem tek seçenektir. Değişken listeleri olan diller için, iki kez tersine yöntem, kısa listeler için iyi bir fikir olabilir (bunu kıyaslama konusunda bir yol yoktur). Tersine çevrilecek liste çeşitli veri yapılarının bir parçası olarak kullanılıyorsa, bunu değiştirmek mümkün olmayabilir. Son olarak, sadece bir kez kullanılan uzun bir değişken listesi için, 'reverse! 'Kullanmak daha iyidir. – soegaard

11

ya last için push, veya kullanım nconc:

> (defparameter a (list 1 2 3)) 
A 
> (push 4 (cdr (last a))) 
(4) 
> a 
(1 2 3 4) 
> (nconc a (list 5)) 
(1 2 3 4 5) 
> a 
(1 2 3 4 5) 

not bu destructiveoperators, yani bunlara bağlanmasını değerini a arasında, sadece olan nesne ve değişiklikler olduğu .

Bu

neden ve ödeyecekleri yapmanız gerekir alıntılanan listelerde asla kullanım nconc, (nconc '(1 2 3) '(4 5 6)) gibi.

İlgili konular