2016-10-09 3 views
1

Ну, мне сказали сделать функцию Matrix Transpose в общем lisp. Я новичок, поэтому я не знаю, как много.Matrix Transpose Common Lisp

My Matrix - это список списков, и я не могу использовать apply, mapcar или аналогичный для его решения, просто CONS, CAR и CDR. Если нет, то мое решение было бы это (я кладу это решение, так кто-то может использовать его):

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

Но я не могу ничего из вышеперечисленного использовать.

Функция должна быть рекурсивной, без петель или аналогичной.

Итак, вопрос в том, как это можно сделать?

Вот как далеко я ушел, но он получил ошибку переполнения. Я не знаю, как это сделать (я мог бы сделать это в C++ или Java, но я попросил, чтобы сделать это в Лиспе ...)

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

Любая помощь будет благодарил!

+0

Зачем нужны ограничения? – Carcigenicate

+0

Просто потому, что учитель сказал. Я не понимаю ограничений –

+1

Нечетное требование. Я бы подумал, что позволить новичкам использовать основные функции языка - это хорошо. – Carcigenicate

ответ

4

Это простое решение, которое не использует итерации или функции высокого порядка.

(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 ко всем элементам списков (которые являются списками) и возвращает список, полученный путем «consing» их; cdrs работает таким же образом, на этот раз применяя cdr вместо car.

+0

Теперь я вижу, что я должен делать, я никогда не доберусь до этого решения –

+0

Добро пожаловать. – Renzo