这是原问题:
就是找出一个列表中所有奇偶性跟指定正整数一样的数字,并且输出一个新列表。
这是我的答案:
#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函数里去了,为什么啊!?
你的代码已经很接近正确答案了,只需要稍作修改即可。你需要定义一个函数,输入为一个列表和一个正整数,输出为一个新列表,其中包含所有奇偶性与指定正整数相同的数字。你可以使用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相同的数字。
你似乎没有规定正整数