打印方案中所有具有奇数索引的项目的列表

问题描述 投票:-1回答:1

此代码显示偶数索引:

(define (odd list)
  (if (or (null? list) (null? (cdr list)))
      list
      (cons (car list) (odd (cddr list)))))

文件运行时,我的输入是:odd '(0 2 3 7 5),它应返回(2 7),但应返回(0 3 5)

我认为我的null?之一放错了位置,但不确定在哪里!

scheme racket
1个回答
3
投票

这里有一些问题。首先,请勿在过程定义中使用list作为参数;这将在list中重新定义内置的odd过程,使其不可用(并非您在这里需要它)。

当输入列表的carcdrnull?时,OP代码返回输入列表;这是不正确的。如果输入列表的cdr为空,则输入为一个具有偶数索引的元素的列表。而是在这种情况下返回'()

最后考虑:

(cons (car list) (odd (cddr list)))

cons将输入列表的第一个元素添加到奇数索引元素的结果列表中;但是,输入列表always的第一个元素具有偶数索引!这是因为初始输入列表的第一个元素的索引为0,并且由于减少了(cddr list),因此递归调用中的每个输入列表也以偶数索引的元素开始。相反,代码需要将输入列表的second元素(conscadr放入奇数索引元素的结果列表中。

此处为更正版本:

(define (odd xs)
  (if (or (null? xs) (null? (cdr xs)))
      '()
      (cons (cadr xs) (odd (cddr xs)))))

样本REPL交互:

> (odd '())
()
> (odd '(0))
()
> (odd '(0 2))
(2)
> (odd '(0 2 3 7 5))
(2 7)
© www.soinside.com 2019 - 2024. All rights reserved.