首页 > 解决方案 > 在 Scheme 中打印具有奇数索引的所有项目的列表

问题描述

此代码正在打印偶数索引:

(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?s 放错了位置,但我不确定在哪里!

标签: schemeracket

解决方案


这里有几个问题。首先,不要list在过程定义中用作参数;这重新定义了 中的内置list过程odd,使其不可用(不是您在这里需要它)。

当输入列表的car或为 时,操作码返回输入列表;这是不正确的。如果输入列表的 为空,则输入是具有偶数索引的一个元素的列表。相反,在这种情况下返回。cdrnull?cdr'()

最后,考虑:

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

cons是输入列表的第一个元素到奇数索引元素的结果列表中;但是,输入列表的第一个元素总是有一个偶数索引!这是因为初始输入列表的第一个元素的索引为 0,并且由于 reduce ,递归调用中的每个输入列表也以偶数索引元素开始(cddr list)。相反,代码需要将输入列表cons第二个元素 (the cadr) 放到奇数索引元素的结果列表中。

这是一个更正的版本:

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

推荐阅读