2016-11-05 5 views
0

Ich habe: eine Liste mit Listen von Werten, z.Common Lisp Erstellen Matrix aus der Liste

(List (list 1 2) (list 3 4 5) (list 1)) 

Hinweis: es ist 2-dimensionaler Array, so kann ich nicht eine Struktur wie diese: (LIST (LIST (LIST 1))), in anderen Worten, es kann innerhalb sekundäre Liste nur Zahlen \ Buchstaben sein.

Ich möchte: Erstellen Sie eine Funktion, die meine Liste machen die gleiche Anzahl von Spalten mit Null die haben leere Felder zu füllen, so dass, wenn ich Liste habe von oben als Eingabe, wird mein ausgegeben:

((1 2 nil nil) 
(3 4 5 nil) 
(1 nil nil nil)) 

Es tut mir leid, es muss einfach sein, aber ich bin Anfänger in Lisp und funktionale Programmierung.

Hinweis: Ich muss CONS und APPEND nur verwenden, aber (das ist mein Hauptproblem) CONS wird jedes Element in eine andere Liste einfügen und APPEND wird alle NILs entfernen.

UPD: ich getan habe, wie es unten gesagt wurde, aber ich habe immer noch ein Problem

(DEFUN FINDMLENGTH (INPUT) 
(COND 
    ((NULL INPUT) NIL) 
    (T (AND 
      (COND ((< MAXLENGTH (length (CAR INPUT))) (SETQ MAXLENGTH (length (CAR INPUT))))) 
      (FINDMLENGTH (CDR INPUT)))))) 

(DEFUN MAKESQUARE (INPUT RowNumb) (prog (a)) 
(COND 
    ((NULL INPUT) NIL) 
    (T (AND 
      (SETQ SqMatr (APPEND SqMatr (LIST (append (car INPUT) (make-list (- RowNumb (length (CAR INPUT)))))))) 
      (MAKESQUARE (CDR INPUT) RowNumb))))) 
(SETQ SqMatr nil) 
(SETQ MAXLENGTH 0) 

Das Problem ist, dass ich derzeit globale Variablen bin mit Daten zu übergeben, kann jemand klären, wie kann ich sie machen Variable von ihnen selbst zurückgeben?

+0

Warum 4 Elemente pro innere Liste in Ihrem Beispiel? Wird es als Eingabe gegeben? – coredump

+0

Es ist ein Beispiel dafür, was Eingabe sein kann, Anzahl der Zeilen und Spalten ist nicht definiert. – rainbowShiningUnicorn

Antwort

2

Ein Ausgangspunkt für Ihre Hausaufgaben: Sie können für jede Zeile die Funktion make-list benutzen, um eine Liste von n nil Elementen zu erstellen, wobei n = gewünschte Länge - Länge der bereits vorhandenen Zeile. Dadurch wird eine Liste mit den Füll-Nils erstellt. Dann können Sie das an die erste Zeile anhängen. Beispiel:

(append '(1 2) (make-list (- 4 (length '(1 2))))) => (1 2 nil nil)

dies für jede Zeile Sie, um das Ergebnis angehängt wird.