2016-11-05 132 views
0

我有:帶有值列表的列表,例如,Common Lisp從列表中創建矩陣

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

注意:它是2維陣列,所以我不能得到這樣的結構:(LIST (LIST (LIST 1))),換言之,只能有數字\字母內部次列表。

我想:創建一個函數,這將使我的名單已經使用零的相同的列數,以填補空字段,所以如果我從上面輸入有名單,我的輸出將是:

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

我很抱歉,它很容易,但我是Lisp和函數式編程的新手。

注:我只能使用CONS和APPEND,但(這是我的主要問題)CONS會將每個元素放在不同的列表中,APPEND將刪除所有的nil。

UPD:我已經做了,因爲它是在下面說,但是我仍然有1個問題

(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) 

的問題是,我目前使用全局變量來傳遞數據,可有人闡明我怎樣才能讓他們由他們自己返回變量?

+0

爲什麼你的例子中每個內部列表有4個元素?它是作爲輸入給出的嗎? – coredump

+0

這是可以輸入的示例,行數和列數未定義。 – rainbowShiningUnicorn

回答

2

作業的起點:您可以使用函數make-list爲每行創建一個n個nil元素的列表,其中n =所需長度 - 您已擁有的行的長度。這將創建一個列表,其中包含填充nils。然後你可以將它附加到最初的行。 例子:

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

這樣做對每一行,附加的結果。