2016-04-11 14 views
0

Ziemlich einfache Frage. Mein anfänglicher Ansatz war, eine andere Prozedur zu definieren, um das letzte Element von lst innerhalb des vorletzten zu finden. Nachdem ich das letzte Element gefunden habe, habe ich es mit dem ersten Element von lst (car lst) angehängt. So funktioniert Append. (append list1 list2) zB (anhängen '(1 2 3)' (2 1 5)) -> (1 2 3 2 1 5) Ich frage mich, ob das Problem nur mit meiner Syntax ist, aber ich bin nicht sicher.Geben Sie das erste und letzte Element in der Liste zurück. Schema

(define (first-last lst) 
(define (last lst) 
    (cond ((null? (cdr lst))(car lst)) 
    (else (last (cdr lst))))) 
(append(car lst)(last lst))) 

Der Fehler tritt in der

(append(car lst)(last lst))) 

"MCAR: Vertragsverletzung

erwartet: mpair

gegeben: 1"

Dies ist meine erste Frage auf stapeln, es tut mir also leid, wenn die Frage nicht richtig dargestellt wird.

Antwort

1

append ist nur für Beitritt zwei oder mehr Listen. Hier schließen Sie sich jedoch nicht bestehenden Listen an, sondern erstellen eine Liste aus zwei Elementen. Dafür verwenden list:

(list (car lst) (last lst)) 
+0

Vielen Dank für Ihre Antwort! – wooot

1

Wenn Sie match, eine saubere Lösung ist möglich nutzen können:

(define first-last 
    (lambda (x) 
    (match x 
      ((first rest ... last) 
      (list first last)) 
      ((only) (list only only)) 
      (_ #f)))) 

Natürlich Sie etwas anderes als #f in der catch-all-Klausel zurückkehren konnte.

+0

'match' ist eine' #! Racket'-Funktion und keine '#! R [56] rs'-Funktion. Da der Fehler "mcar" erwähnt, ist es nicht "#! Racket", das das OP verwendet. – Sylwester

+0

Ich benutze die portable 'match' Implementierung von Alex Shinn (mit Guile), nicht das Racket' match'. Die Frage selbst bezieht sich auf das Schema im Allgemeinen, nicht auf eine spezifische Implementierung, obwohl Sie möglicherweise auf die Implementierung schließen können. –

Verwandte Themen