我方案以下數組:總結各行的第一n個元素中的2D陣列方案
((64 28 52 24) (68 29 62 29) (20 72 48 60) (45 102 75 51) (36 84 72 64) (80 9 63 60) (20 56 72 24) (57 53 88 63))
欲形成通過累加「組合」 Ñ行的2D陣列在一行中。例如,假設n = 2前兩行我們將合併成一行((132 57 114 53) ...)
?
我方案以下數組:總結各行的第一n個元素中的2D陣列方案
((64 28 52 24) (68 29 62 29) (20 72 48 60) (45 102 75 51) (36 84 72 64) (80 9 63 60) (20 56 72 24) (57 53 88 63))
欲形成通過累加「組合」 Ñ行的2D陣列在一行中。例如,假設n = 2前兩行我們將合併成一行((132 57 114 53) ...)
?
好的,所以你在這種情況下有一個事物(行)的列表,並且你想一次對它們應用一個操作f
(添加行)n
。所以我會爲(on-chunks n f lst)
製作一個通用功能。
然後您的操作可以定義爲(on-chunks 2 row-sum matrix)
。定義行數很容易:(define (row-sum row1 row2) (map + row1 row2))
。
對於分塊部分,我建議爲它定義一個幫助函數,它將一個塊從列表的前面取出並返回兩個值:該塊,列表的其餘部分。然後通過調用該函數,可以通過遞歸實現on-chunks
。例如(chunk-aux 2 '(a b c d e f)) ;=> (a b) (c d e f)
。
我希望有幫助!
擴大在上述答案,摺疊將是一個非常簡單的方法來遞歸地總結n行,而SRFI-1的(take)
和(drop)
程序將分裂爲所需的二維列表:
(use srfi-1)
(define (sum-rows xs)
(foldl (lambda (x acc)
(map + x acc))
(car xs)
(cdr xs)))
(define (merge-rows xs n)
(cons (sum-rows (take xs n))
(drop xs n)))
雖然性能不適用於荒謬的長列表,因爲(take)
和(drop)
可能是冗餘計算。