用于构建偶数整数列表的Scheme函数

时间:2017-04-17 00:48:44

标签: list scheme racket

我正在尝试在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"。有什么想法吗?

1 个答案:

答案 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)))))