Scheme函数,以列表和原子作为参数并返回原子出现的第一个位置的索引

时间:2019-04-16 19:26:03

标签: list function scheme

我是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. 我如何定义原子是什么?

  2. 为什么会出现以下错误? “定义:只希望函数主体有一个表达式,但发现了多余的一部分”

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