0

该函数应该找到每一行的总和并将其放入列表中。我认为这样的事情会起作用,但事实并非如此。它给了我一个奇怪的输出。

就像,如果我有一个有两行和两列 1 的矩阵,它会返回:

(2 . 1)

而不是这个:

(2 2)

帮助?

(define (sum mat)
  (let loop ([r 0]
         [c 0])
   (if (> r (matrix-rows mat)) '()
      (if (>= c (sub1 (matrix-cols mat))) (add1 r)
         (cons (+ (matrix-ref mat r c) (matrix-ref mat r (add1 c))) (loop r (add1 c)))))))
4

1 回答 1

0

而不是打电话给(add1 r)你应该打电话(loop (+ r 1) 0)。注意:这个建议是正确的;但是,您的代码中可能还有其他错误,特别是您使用 matrix-ref 调用的计算看起来不会累加一行。您可以通过使用多于两行的矩阵进行测试来看到这一点。

这是一个修复:

(define (sum mat)
  (let loop ((r 0) (c 0) (s 0) (a '())   ;; row, col, sum, ans
    (cond ((>= r (matrix-rows mat)) (reverse a))
          ((>= c (matrix-cols mat)) (loop (+ r 1) 0 0 (cons s a)))
          (else (loop r (+ c 1) (+ s (matrix-ref mat r c)) a)))))
于 2013-04-26T22:14:32.220 回答