我在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))
答案 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))