2014-06-16 74 views
1

我有這樣的代碼方案:方案移調矩陣

(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 

我聽不太懂系NR 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行特別使用了一個非常具體的條件,第7行似乎沒有包括最後一列。手工操作似乎是'(transpose2'((1 2)(3 4)(5 6)))''出來是'(1 3 4)',這是非常錯誤的... – Schism

+0

是的,那個代碼作品。我用樣本結果編輯了我的代碼。 – user3669300

+0

啊,我明白了。出於某種原因,我把'pair?'字面地對待,而不是像'cons?'/'list?'一樣。 – Schism

回答

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)) 
+0

我跳過了很多步驟的故障。如果你願意,我可以深入一些。 – Schism

+0

這沒有必要;)感謝您的幫助,現在我明白了。 – user3669300