0

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

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

但是当输入奇数长度的列表例如: (odds '(abcde)) 它将返回 (ac . e)

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

4

2 回答 2

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

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

于 2012-11-14T22:55:52.043 回答
-1

您的代码存在一些问题:

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

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

  • ((= (长度 lis) 1) (汽车 lis))

此终端条件有 3 个错误:

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

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

  3. 您可以抛出(错误“某事”),而不是在答案末尾附加错误消息

所以,去掉这两个条件,你的代码就是你想要的。

(define (odds lis)
(cond
    ((null? lis) '())
    ((not (list? lis)) (quote (Usage: odds(list))))
    (else (cons (car lis) (odds (cddr lis))))))
于 2012-11-14T23:48:40.860 回答