SICP Exercise 2.20,语言是MIT Scheme

这是原问题:

img

img

img

就是找出一个列表中所有奇偶性跟指定正整数一样的数字,并且输出一个新列表。
这是我的答案:

#lang sicp
(define (par? x)
  (remainder x 2))

(define (same_parity x . y)
  (let ((par (remainder x 2)))
    (if (null? (car y))
        nil
        (if (= (par? (car y)) par)
            (cons (list (car y)) (same_parity x . (cdr y)))
            (same_parity x . (cdr y))))))

(define test_lst (list 1 2 3 4 5 6 7 8))

测试时的代码:

(same_parity 3 test_lst)

报错信息:

remainder: contract violation
  expected: integer?
  given: (1 2 3 4 5 6 7 8)

我问过chatgpt了它没找出问题,我的(car y)没有成功提取出第一个列表元素,而是直接把整个列表输入到remainder函数里去了,为什么啊!?

以下内容部分参考ChatGPT模型:


你的代码已经很接近正确答案了,只需要稍作修改即可。你需要定义一个函数,输入为一个列表和一个正整数,输出为一个新列表,其中包含所有奇偶性与指定正整数相同的数字。你可以使用filter函数和lambda表达式来实现这个函数。以下是一个示例代码:

(define (same-parity lst n)
  (define (par? x)
    (remainder x 2))
  (filter (lambda (x) (= (par? x) (par? n))) lst))

例如,对于列表 '(1 2 3 4 5 6 7) 和正整数 3,调用 (same-parity '(1 2 3 4 5 6 7) 3) 将返回一个新列表 (1 3 5 7),其中包含所有奇偶性与3相同的数字。


如果我的建议对您有帮助、请点击采纳、祝您生活愉快

你似乎没有规定正整数