(product (list 1 2 3) (list 4 5 6)) から
(+ 4 (product (list 2 3) (list 5 6))) が得られる過程
(product (list 1 2 3) (list 4 5 6))
= …
= (+ 4
(product (list 2 3) (list 5 6)))
= …
= (+ 4
(+ 10
(product (list 3) (list 6))))
= …
= (+ 4 (+ 10 (+ 18 (product empty empty))))
= …
= 32
(product (list 1 2 3) (list 4 5 6))
= (cond
[(empty? (list 1 2 3)) 0]
[else (+ (* (first (list 1 2 3)) (first (list 4 5 6)))
(product (rest (list 1 2 3)) (rest (list 4 5 6))))])
= (cond
[false 0]
[else (+ (* (first (list 1 2 3)) (first (list 4 5 6)))
(product (rest (list 1 2 3)) (rest (list 4 5 6))))])
= (+ (* (first (list 1 2 3)) (first (list 4 5 6)))
(product (rest (list 1 2 3)) (rest (list 4 5 6))))
= (+ (* 1 (first (list 4 5 6)))
(product (rest (list 1 2 3)) (rest (list 4 5 6))))
= (+ (* 1 4)
(product (rest (list 1 2 3)) (rest (list 4 5 6))))
= (+ 4 (product (rest (list 1 2 3)) (rest (list 4 5 6))))
= (+ 4 (product (list 2 3) (rest (list 4 5 6))))
= (+ 4 (product (list 2 3) (list 5 6)))
この部分は
これは,
(define (product x y)
(cond
[(empty? x) 0]
[else (+ (* (first x) (first y))
(product (rest x) (rest y)))]))
のxを(list 1 2 3) で,yを(list 4 5 6) で置き換えたもの
71