我对 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
- 不要将变量命名为
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)))))