Matrix Transpose Common Lisp

时间:2016-10-09 11:47:01

标签: recursion common-lisp transpose

好吧,我被告知要在普通的lisp中制作Matrix Transpose功能。我是初学者,所以我不太了解它。

My Matrix是一个列表列表,我不能使用apply,mapcar或类似方法来解决它,只需CONS,CAR和CDR。如果没有,我的解决方案将是这个(我把这个解决方案,所以有人可以使用它):

(DEFUN transpose (List)
    (apply #'mapcar #'list List)
)

但我不能使用上述任何内容。

该函数必须是递归的,没有循环或类似的。

所以,问题是,怎么办呢?

这是我走了多远,但它让我出现溢出错误。我真的不知道该怎么做(我本可以用C ++或Java完成它,但我被要求在Lisp中做到这一点......)

    (DEFUN transpose (Matrix)
        (COND   ((NULL Matrix) NIL
                ) 
                (T (CONS (CAR(CAR Matrix))(transpose (CONS (CAR(CDR Matrix)) (CDR Matrix))))
                )
        )
    )

感谢任何帮助!

1 个答案:

答案 0 :(得分:5)

这是一个不使用迭代或高阶函数的简单解决方案。

(defun cars (matrix)
  "Return a list with all the cars of the lists in matrix"
  (if (null matrix)
      nil
      (cons (car (car matrix)) (cars (cdr matrix)))))

(defun cdrs (matrix)
  "Return a list with all the cdrs of the lists in matrix"
  (if (null matrix)
      nil
      (cons (cdr (car matrix)) (cdrs (cdr matrix)))))

(defun transpose (matrix)
  "Transpose matrix"
  (cond ((null matrix) nil)
        ((null (car matrix)) nil)
        (t (cons (cars matrix) (transpose (cdrs matrix))))))

函数transpose使用两个辅助函数:cars返回一个列表,其中包含表示矩阵的列表的所有第一个元素,而cdrs返回一个包含所有剩余部分的列表。代表矩阵的列表,所以我们可以使用递归。

cars通过递归car应用于列表的所有元素(即列表),并返回通过“消耗”它们获得的列表; cdrs的工作方式相同,这次应用cdr代替car