Scheme 如何消除cons的副作用?

Scheme 如何消除cons的副作用?,scheme,period,cons,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)))))) 但当输入奇数长度的列表时 例如:(赔

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

(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)


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

试试这个,这只是一句话的变化:

(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))))))

在突出显示的行中,您返回的是单个元素而不是正确的列表(以null结尾的列表),这就是导致问题的原因。

您的代码存在一些问题:

  • ((null?(car lis))“())不是必需的
这是不必要的,因为当列表有1个元素时,car将不为null,最后一个条件处理它,当列表没有元素时,第一个条件处理这种情况

  • (=(长度列表)1)(车辆列表))
此终端条件有3个错误:

  • 这是不必要的,因为最后一个条件处理的是1个元素的列表

  • 它不返回一对,而是返回一个原子元素。当它被消耗为一对时,结果将是(x.atom)

  • 您可以抛出一个(错误“something”),而不是在答案的末尾追加一条错误消息

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

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

    更简单的方法是:直接使用
    lis
    而不是
    (列表(汽车列表))
    。在这一点上,它已经是一个单身列表了。