乐正

Actions speak louder than words.

Sicp-ex2-20

问题

过程+*list可以取任意个数的实际参数,定义这类过程的一种方式是采用一种带 点尾部记法的形式的define。在一个过程中,如果在形式参数表的最后一个参数之前有一 个点号,那就表明,当这一过程被实际调用时,前面各个形式参数(如果有的话)将以前面 的各个实际参数为值,与平常一样。但最后一个形式参数将以所有剩下的实际参数的表为值 。例如,假若我们定义了:

1
(define (f x y . z) <body>)

过程f就可以用两个以上的参数调用。如果求值:

1
(f 1 2 3 4 5 6)

那么在f的体里面,x将是1,y将是2,而z将是表(3 4 5 6)。给了定义:

1
(define (g . w) <body>)

那么过程g可以用0个或者多个参数调用。如果求值:

1
(g 1 2 3 4 5 6)

那么在g的体里面,w将是表(1 2 3 4 5 6)。

请采用这种记法形式写出过程same-parity,它以一个或者多个整数为参数,返回所有与 其第一个参数有着同样奇偶性的参数形成的表。例如:

1
2
3
4
5
(same-parity 1 2 3 4 5 6 7)
(1 3 5 7)

(same-parity 2 3 4 5 6 7)
(2 4 6)

解答

练习2.20 (ex2-20.scm) download
1
2
3
4
5
6
7
8
9
10
11
12
;; Happy hacking Yuez - Emacs ♥ you!

(define (same-parity . numbers)
  (let ((operator (if (even? (car numbers)) even? odd?)))
    (define (iter remains result)
      (if (null? remains)
          (reverse result)
          (if (operator (car remains))
              (iter (cdr remains) (cons (car remains) result))
              (iter (cdr remains) result))))

    (iter (cdr numbers) (list))))

测试

1
2
3
4
5
(same-parity 2 3 4 5 6 7 8 9 10)
;Value 21: (4 6 8 10)

(same-parity 1 3 2 5 6 7 8 9)
;Value 22: (3 5 7 9)

draft

« sicp-ex2-19 sicp-ex2-21 »

Comments