方案转置矩阵

时间:2014-06-16 14:26:43

标签: scheme

我在Scheme中有这样的代码:

(define transpose2                      ;1
 (lambda (A T)                          ;2
  (if (pair? (car A))                   ;3
   (transpose2                          ;4
    (map cdr A) (cons (map car A) T)    ;5
   )                                    ;6
   (reverse T)                          ;7
  )                                     ;8
 )                                      ;9
)                                       ;10

我无法理解第5行。如何在此行中创建一对最终导致转置给定矩阵?

(define transpose                                ;1 
 (lambda (A)                                     ;2
  (transpose2 A `())                             ;3
 )                                               ;4 
)                                                ;5

之前的函数transpose2由此函数执行,例如:

(display (transpose '((1 2) (3 4) (5 6))))
(display (transpose '((3 2 1) (2 1 1) (3 1 1))))

给出结果:

((1 3 5) (2 4 6))
((3 2 3) (2 1 1) (1 1 1))

1 个答案:

答案 0 :(得分:3)

此处有两个参数:A,原始矩阵和T,累加器。

在第3行,我们会检查A的第一个元素是否为列表,例如以'(1)的形式。如果是,那么我们会递归A(map cdr A)减少一列,并将每个A的第一个成员累加到T。当我们最终耗尽我们的列表时,我们将我们的累加器反转并返回它。

如果第3行的条件被(not (empty? A))替换,则代码可能会更清晰。

示例跟踪:

   (transpose '((1 2) (3 4) (5 6)))
-> (transpose2 '((1 2) (3 4) (5 6)) '())
-> (transpose2 (map cdr A) (cons (map car A) T))
-> (transpose2 '((2) (4) (6)) '((1 3 5)))
-> (transpose2 '(() () ()) '((2 4 6) (1 3 5)))
-> (reverse '((2 4 6) (1 3 5)))
-> '((1 3 5) (2 4 6))