总结Scheme中2D数组中每行的前n个元素

时间:2017-12-27 18:13:18

标签: scheme

我在Scheme中有以下数组:

((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))

我希望通过在一行中总结'组合' n 行来形成二维数组。例如,假设前两行的 n = 2 ,我们将合并为一行((132 57 114 53) ...)

2 个答案:

答案 0 :(得分:0)

好的,所以你在这种情况下有一个东西(行)列表,并且你想一次在它们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)

我希望有所帮助!

答案 1 :(得分:0)

扩展上面的答案,折叠将是递归总结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)将是冗余计算。