scheme แบบถึก ช้า ยาว เปลืองหน่วยความจำ
แค่พยายามจะ functional + list
(define (empty? l)
(= (length l) 0))
(define (tr mat)
(define (prepare row)
(if (empty? row)
(list)
(cons (list)
(prepare (cdr row)))))
(define (col-iter row tmat)
(cond
((> (length row) 0)
(cons (cons (car row)
(car tmat))
(col-iter (cdr row)
(cdr tmat))))
(else null)))
(define (row-iter mat tmat)
(cond
((> (length mat) 0) (row-iter (cdr mat)
(col-iter (car mat)
tmat)))
(else tmat)))
(row-iter (reverse mat)
(prepare (car mat))))
(define (mul a b)
(define (b-row-iter ra rtb)
(if (empty? rtb)
0
(+ (* (car ra)
(car rtb))
(b-row-iter (cdr ra)
(cdr rtb)))))
(define (col-iter ra tb)
(if (empty? tb)
null
(cons (b-row-iter ra
(car tb))
(col-iter ra
(cdr tb)))))
(define (row-iter a tb)
(if (empty? a)
(list)
(cons (col-iter (car a)
tb)
(row-iter (cdr a)
tb))))
(row-iter a
(tr b)))
(define a (list (list 1 2)
(list 3 4)
(list 5 6)
(list 7 8)))
(define b (list (list 10 20 30)
(list 40 50 60)))
(mul a b)กระทู้เก่าๆ จะย้ายตามไปในภายหลัง ตอนนี้ปิดการโพสต์กระทู้ไว้ เหลือไว้เฉพาะอ้างอิงเท่านั้น
พยายามใช้ lambda foldl และ map เผื่อจะสั้นลง
(define (tp a) (foldl (lambda (ra ans) (map cons ra ans)) (foldl (lambda (x ans) (cons (list) ans)) (list) (car a)) (reverse a))) (define (mul_ a tb) (foldl (lambda (ra ans) (cons (reverse (foldl (lambda (rtb ans) (cons (foldl + 0 (map * rtb ra)) ans)) (list) tb)) ans)) (list) a)) (define (mul a b) (mul_ (reverse a) (tp b))) (define a (list (list 1 2) (list 3 4) (list 5 6) (list 7 8))) (define b (list (list 10 20 30) (list 40 50 60))) (mul a b)ใช้คำว่า iter น่าจะไม่ค่อยถูกด้วย ....