2016-04-12 21 views
0

Bu prosedür, verilen 3 listeden alternatif değerler içeren bir liste döndürmelidir. Yani örneğin (alt ('a b c)' (1 2 3) '(i j k))' (a 1 i b 2 j c 3 k) 'i döndürmelidir.Verilen 3 listenin alternatif elemanlarını döndür. Şema

Bu benim şu ana kadar benim mantığım. Her listenin ilk elemanını alıp yeni argümanlar olarak cdr ile tekrar tekrar prosedürü çağırırdım.

(define (alternate lst1 lst2 lst3) 
    (cons (car lst1) 
      (cons (car lst2) 
       (cons (car lst3) 
       (alternate (cdr lst1)(cdr lst2)(cdr lst3)))))) 

hata

oluşur
(cons (car lst1) 

(eksileri reklamı) yeni döndürür "mcar:? Mpair

() vermiş olduğu : ihlal

beklenen sözleşme" ilk elemanı bir ve ikinci eleman olan ayrılmış çift d. Ancak, verilen 2 liste bulunmadığından, liste oluşturmaya yaklaşmanın başka bir yolu var mı?

Bu başka bir yaklaşım mıdır?

(define (alternate lst1 lst2 lst3) 
    (list (car lst1)(car lst2)(car lst3)) 
     (alternate (cdr lst1)(cdr lst2)(cdr lst3))) 

cevap

2

Hatayı önlemek için boş liste denetimi eklemeniz gerekir. Yani kod aşağıdaki gibi görünmelidir:

(define (alternate lst1 lst2 lst3) 
    (if (or (null? lst1) (null? lst2) (null? lst3)) 
     '() 
     (cons (car lst1) 
     (cons (car lst2) 
      (cons (car lst3) 
      (alternate (cdr lst1)(cdr lst2)(cdr lst3))))))) 

Eğer srfi-1 (veya daha doğrusu append-map) kullanabilir, o zaman da böyle yazabilirsiniz:

(define (alt l1 l2 l3) (append-map list l1 l2 l3)) 
+0

Görüyorum ki, bu mantıklı. Cevabınız için teşekkürler. – wooot

1

Sadece şu kullanabilirsiniz standart Şeması:

(define (alternate . lists) 
    (apply append (apply map list lists))) 

çok optimize fakat işi :)

Eval yapar değil: http://eval.ironscheme.net/?id=175