我正在尝试在Scheme中编写一个函数,该函数将列表作为参数并返回一个列表,该列表仅包含参数列表中的偶数整数。在解决了这个问题之后,我就提出了这个问题:
(define (even-list n)
(if (even? car(n))
(cons car(n) even-list(cdr(n)))
(even-list cdr(n))
)
)
要测试我的函数even-list
我已经构建了一个小列表作为参数传递给函数。但是,当我运行下面的代码时,所有发生的事情都是输出列表:
even-list (list 1 2 3 4 5 6 7 8 9 10)
似乎它甚至没有调用该函数,因为我用then
替换"even"
子句并且从未输出"even"
。有什么想法吗?
答案 0 :(得分:2)
请注意,方案/球拍使用prefix表示法,因此应用的任何程序都会围绕左右括号(function-name arg1 arg2 ...)
进行处理。
这意味着car(n)
,cdr(n)
,even-list(...)
等语法无效,应替换为(car n)
,(cdr n)
,{{1}分别等。
这也是为什么在修改程序(even-list ...)
时没有看到输出有任何变化的原因,因为只需编写
even-list
您正在调用可能/可能未绑定的标识符(even-list (list 1 2 3 4 5 6 7 8 9 10)
)(在这种情况下,它与函数定义绑定)和表达式even-list
。此表达式是返回列表输出的内容,并且您在(list 1 2 3 4 5 6 7 8 9 10)
中所做的任何更改都不会反映在此列表中,因为您实际上并未将其作为参数传递给过程,而是简单地使用even-list
内置程序。
将行修复为:
list
您将开始注意到来自您的过程逻辑的错误。例如,您的recursive函数没有基本情况,这意味着当函数通过列表递归时,当它到达零元素列表(even-list (list 1 2 3 4 5 6 7 8 9 10))
时,它仍然会尝试应用'()
,这是(car n)
上的合同违规,因为期望参数car
。
请考虑以下事项:
pair?
或使用内置filter
程序:
(define (even-list lst)
(cond
((null? lst) empty) ; base case (empty? list)
((even? (car lst)) ; even? first element
(cons (car lst) (even-list (cdr lst))))
(else (even-list (cdr lst)))))