2015-06-11 43 views
4

的名單我在拍一個列表的列表,並有轉他們。矩陣轉置(名單

(: transpose ((list-of(list-of %a)) -> (list-of (list-of %a)))) 

(check-expect (transpose (list (list 1 2 3) 
           (list 4 5 6))) 
       (list (list 1 4) 
        (list 2 5) 
        (list 3 6))) 

(define transpose 
    (lambda (xs) 
    (cond 
     ((empty? xs)empty) 
     ((pair? xs)(make-pair (make-pair (first(first xs)) (make-pair (first(first(rest xs)))empty)) (transpose (rest(rest xs)))))))) 

這是我此刻的代碼。 我認爲這個問題是在遞歸調用(糾正我,如果我錯了,請)。

的實際結果是(list (list 1 4)),其餘似乎有點忽略。

這將真正幫助我,如果有人知道的問題,還是有一個提示。

回答

13

transpose最簡單的定義是:

(define (transpose xss) 
    (apply map list xss)) 

爲什麼它的工作?

這裏List是拼寫大寫字母,只顯示其list由用戶給定的,並且是由map生產。

這是一個不太「聰明」的解決方案。它使用第一列 矩陣成爲轉置矩陣中的第一行。

(define transpose 
    (lambda (xss) 
    (cond 
     [(empty? xss)   empty] 
     [(empty? (first xss)) empty] 
     [else     (define first-column (map first xss)) 
          (define other-columns (map rest xss)) 
          (cons first-column 
            (transpose other-columns))]))) 
+0

非常感謝=) – b4shyou

+0

Python中的等價物是'apply(zip,[['a','b'],['c','d'],['e','f']]]) '。我知道你並沒有問過關於Python的問題,但我將其作爲常識提供。 Python有大量的lispy bit以「垃圾場 - 戰爭」的風格聚集在一起。與朋友分享也比任何真實的口齒禪更容易。 –

1

for/list可以按順序使用,以創建列表與轉項的列表:

(define (transpose_ lol)     ; lol is list of lists 
    (for/list ((i (length (list-ref lol 0)))) ; loop for length of first inner list 
    (for/list ((il lol))     ; for each inner list (il) 
     (list-ref il i))))     ; get its item 

測試:

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

輸出:

'((1 4) (2 5) (3 6)) 
-1
(define (tr ls) 
    (if (empty? (car ls)) empty 
(if (null? ls) empty 
    (cons (map car ls) (tr (map cdr ls)))))) 
+3

您可以通過縮進4個空格將代碼放入代碼塊中。請同時添加對您答案的解釋,而不僅僅是一段代碼。 – bendl

+3

請幫助解決StackOverflow是一個免費的代碼編寫服務的誤解,只需在代碼中添加解釋即可。 – Yunnosch

+0

問題是從2015年起 – ghosh