list - 将列表和原子作为参数的方案函数并返回原子出现的第一个位置的索引
问题描述
我对 Scheme 很陌生,正在解决一个定义如下的问题:
编写一个方案函数 find-loc,它接受两个参数,一个列表 lst 和一个原子 atm,并返回 atm 在列表中出现的第一个位置的索引。位置索引是 1 相对的。如果列表中没有出现 atm,则函数返回 n + 1,其中 n 是列表的长度。
到目前为止我得到的是:
(define (find-loc list atm)
(if (not(list? list))
0
(cond
((null? list)
1)
((eq? (car list)atm)
1))
(else (+ (find-loc (cdr list atm) 1) )))
我觉得我很接近,但有点卡住了。我的主要问题如下:
我如何定义原子是什么?
为什么我会收到以下错误?“定义:函数体只需要一个表达式,但发现了 1 个额外的部分”
解决方案
一个原子由这个谓词定义:
(define (atom? x)
(and (not (null? x))
(not (pair? x))))
您收到的错误是因为if
表达式的语法不正确 - 它必须在条件之后有两部分(结果和替代),而您写了三个。几点评论:
cond
测试多个条件时最好使用 a- 不要将变量命名为
list
,它会与同名的内置过程发生冲突 - 更好地
equal?
用于测试相等性,它更通用 - 我们应该根据要求使用我们新的闪亮
atom?
谓词——即使此时null?
检查是多余的
这就是我的意思:
(define (find-loc lst atm)
(cond ((not (list? lst)) 0)
((null? lst) 1)
((and (atom? (car lst)) (equal? (car lst) atm)) 1)
(else (+ 1 (find-loc (cdr lst) atm)))))
推荐阅读
- google-analytics - 从 ga 迁移到 gtag.js 脚本
- delphi - 重温:TClientDataset“缺少数据提供者或数据包”
- django-rest-framework - 来自 View 的库请求的 Django Rest Framework 返回响应
- apache-kafka - Apache Kafka 和 GCP PubSub 有什么区别?
- python - peewee 库,排序组合
- php - 它只是从 textarea 中插入最后一个值
- reactjs - Elements 上不支持的道具更改:设置后您无法更改“条纹”道具
- c# - 如何使用反射来动态调用类型?
- mybatis - mybatis mapper注解中无法创建hazelcast缓存
- spring-boot - Maria DB JDBC 驱动程序使用过多 CPU