Функция схемы, которая принимает список и атом в качестве параметров и возвращает индекс первого местоположения, в котором находится атом - PullRequest
0 голосов
/ 16 апреля 2019

Я очень новичок в Scheme и работаю над проблемой, определенной следующим образом:

Напишите функцию схемы find-loc, которая принимает два параметра, список lst и atm 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. почему я получаю следующую ошибку?"define: ожидалось только одно выражение для тела функции, но найдена 1 дополнительная часть"

1 Ответ

1 голос
/ 16 апреля 2019

Атомат определяется этим предикатом:

(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)))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...