旋转矩阵的一种方法是使其转置,然后反转所有行。 我在控制台中执行了以下两个功能,分别是map(返回移调)和反向(完成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) ) )
它只是抛出一个错误:
mcar:违反合同 预期:对吗? 给定:()
我尝试导入(srfi:41)(我也在r6rs上工作),但是它也不起作用。不过,此功能适用于3 x 3的矩阵。
我该如何解决?
答案 0 :(得分:0)
您的输入不正确。
(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))