ошибка в задаче доктора Ракета. несвязанный идентификатор в mymeber - PullRequest
0 голосов
/ 03 октября 2019

пытается решить проблему с ракеткой, чтобы определить, находится ли число в списке. получение ошибок

#lang racket
(mymember (x, l))
if l=?null
then "false"
if x==car(l)
then "true"
mymember(x,l)


mymember 2' (1,3,4,5,6)

1 Ответ

2 голосов
/ 03 октября 2019

Ракетка использует префиксную нотацию. Это делает запятые ненужными. Сначала некоторый синтаксис:

Как определить функцию?

( define ( name variable1 variable2 ) body )

Где name - имя функции, а variable s - параметры. За которыми следует выражение body.

Пример:

; Number -> Number
; converts from fahrenheit to celsius.

(define (f2c f)
  (* 5/9 (- f 32)))

Как вызвать функцию?

( name expression1 expression2 )

name - название функции иexpression1 и expression2 являются его аргументами.

Пример:

(sqr 3)
;; == 9

Аналогично, чтобы проверить, равны ли два значения: (equal? x y)

Как использовать выражения if?

( if question-expression then-answer-expression else-answer-expression )

Если значение выражения вопроса не является ложным, if оценивает then-answer-expression, в противном случаеоценивает else-answer-expression.

Пример:

;; Number -> Number
;; reciprocate all non-zero x, otherwise return 0.
(define (inverse-of-x x)
  (if (= x 0) 0 (/ 1 x)))

... и так далее. Прочитайте Руководство по ракеткам , чтобы узнать основные сведения о синтаксисе, семантике и типах данных в языке.


Исправление всего синтаксиса по-прежнему приводит к одной ошибке: бесконечному циклу. Это потому, что рекурсивный вызов не вызывает cdr в списке. Таким образом, рекурсивный вызов выполняется в одном и том же списке (а не в более коротком списке) навсегда. Обтекание cdr и исправление синтаксиса приводит к правильной функции.

#lang racket

; [X] [List-of X] -> "true" U "false"
; is x an element of l?
(define (mymember x l)
  (if (equal? l null)
      "false"
      (if (equal? x (car l))
          "true"
          (mymember x (cdr l)))))


(mymember 2 '())          ; = false
(mymember 2 '(1 3 4 5 6)) ; = false
(mymember 2 '(1 3 2 5 6)) ; = true
...