首页 > 解决方案 > 将列表和原子作为参数的方案函数并返回原子出现的第一个位置的索引

问题描述

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

标签: listfunctionscheme

解决方案


一个原子由这个谓词定义:

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

推荐阅读