Вращая матрицу, почему она не работает как функция, а в командной строке? - PullRequest
0 голосов
/ 02 ноября 2018

Способ поворота матрицы - получить ее транспонирование, а затем перевернуть все строки. У меня есть две функции: map (которая возвращает транспонирование) и reverse (завершение поворота на 90 °), в консоли я делаю следующее:

(в обратном порядке (применить список карт (список (список 1 2 3 4) (список 5 6 7 8) (список 9 10 11 12) (список 13 14 15 16))))

 Result:  {{4 8 12 16} {3 7 11 15} {2 6 10 14} {1 5 9 13}}

Что верно, но когда я сделал функцию, она не работает.

(define (transpose2 matriz)
      (reverse (apply map list matriz))

Затем делаем:

> (transpose2 (list (list 1 2 3 4) (list 5 6 7 8) (list 9 10 11 12) (list 13 14 15) ) )

Просто выдает ошибку:

мкар: нарушение договора ожидается: mpair? дано: ()

Я пробовал импортировать (srfi: 41) (я тоже работаю с r6rs), но он тоже не работает. Эта функция работает для матрицы 3 x 3.

Как я могу это исправить?

1 Ответ

0 голосов
/ 02 ноября 2018

Ваш ввод был неверным.

(transpose2 (list (list 1 2 3 4) 
                  (list 5 6 7 8) 
                  (list 9 10 11 12) 
                  (list 13 14 15))) ;; here are only 3 elements while in the others 4!

(transpose2 (list (list 1 2 3 4) 
                  (list 5 6 7 8) 
                  (list 9 10 11 12) 
                  (list 13 14 15 16))) ;; this works flawlessly - you just forgot 16 before!

DrRacket выдает ошибку:

map: all lists must have same size; arguments were: #<procedure:list> '(1 2 3 4) '(5 6 7 8) '(9 10 11 12) '(13 14 15)

Какой интерпретатор Scheme вы использовали?

#lang racket

(define m (list (list 1 2 3 4)
                (list 5 6 7 8)
                (list 9 10 11 12)
                (list 13 14 15 16)))

(define (transpose2 mat)
  (reverse (apply map list mat)))

(reverse (apply map list m))
(transpose2 m)

;; both give:
;; '((4 8 12 16) (3 7 11 15) (2 6 10 14) (1 5 9 13))
...