方案函数,将列表和原子作为参数,并返回原子发生的第一个位置的索引



我对 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 个额外的部分">

原子由以下谓词定义:

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

最新更新