2016-11-05 37 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)

这样做对每一行,附加的结果。