我是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) )))
我觉得我已经接近了,但是有点卡住了。我的主要问题如下:
我如何定义原子是什么?
为什么会出现以下错误? “定义:只希望函数主体有一个表达式,但发现了多余的一部分”
答案 0 :(得分: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)))))