我怎样才能消除缺点的副作用?

时间:2012-11-14 22:52:32

标签: scheme period cons

我可以使用以下代码获取列表中的奇数元素:

(define (odds lis)
(cond
    ((null? lis) '())
    ((not (list? lis)) (quote (Usage: odds(list))))
    ((null? (car lis)) '())
    ((= (length lis) 1) (car lis))
    (else (cons (car lis) (odds (cddr lis))))))

但输入奇数长度列表时 例如:(赔率'(a b c d e)) 它会回来 (a c.e)

我怎样摆脱这个令人讨厌的时期?

2 个答案:

答案 0 :(得分:0)

试试这个,这只是一行的变化:

(define (odds lis)
  (cond
    ((null? lis) '())
    ((not (list? lis)) (quote (Usage: odds(list))))
    ((null? (car lis)) '())
    ((= (length lis) 1) lis) ; change here
    (else (cons (car lis) (odds (cddr lis))))))

在突出显示的行中,您返回的是单个元素而不是正确的列表(以空值终止的列表),这就是造成问题的原因。

答案 1 :(得分:-1)

您的代码存在一些问题:

  • ((null?(car lis))'())不是必需的

这不是必需的,因为当列表有1个元素时,car不会为null,最后一个条件对应它,当列表没有元素时,第一个条件应对这种情况。

  • ((=(length lis)1)(car lis))

此终端条件有3个错误:

  1. 没有必要,因为最后一个条件适用于1个元素列表的情况。

  2. 它不会返回一对,而是一个原子元素。当它与一对结合时,结果将是(x。原子)

  3. 您可以抛出(错误“某事”)

  4. 而不是在答案的末尾附加错误消息

    因此,删除这两个条件,您的代码将是您想要的。

    (define (odds lis)
    (cond
        ((null? lis) '())
        ((not (list? lis)) (quote (Usage: odds(list))))
        (else (cons (car lis) (odds (cddr lis))))))