scheme - 在 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 放错了位置,但我不确定在哪里!
解决方案
这里有几个问题。首先,不要list
在过程定义中用作参数;这重新定义了 中的内置list
过程odd
,使其不可用(不是您在这里需要它)。
当输入列表的car
或为 时,操作码返回输入列表;这是不正确的。如果输入列表的 为空,则输入是具有偶数索引的一个元素的列表。相反,在这种情况下返回。cdr
null?
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)
推荐阅读
- ios - 单击单元格中的按钮时访问所有单元格
- laravel-5 - 如何从 Laravel 视图中的链接调用控制器方法?
- javascript - Chrome 扩展通知:页面加载时的 API 调用
- jms - 带有 TLS 的 Websphere MQ 的 Nifi JMS 输入
- sql - 为每个参数选择第一个结果
- python - Python只打印一个文件
- javascript - parseFloat 与数字后的字符
- html - 我的图像损坏,没有出现在 HTML 代码中
- javascript - “无法访问未初始化的变量。” 在类构造函数中
- javascript - 尽管选择了收音机,但仍显示错误消息