首页 > 解决方案 > Dr Racket 问题中的错误。mymeber 中的未绑定标识符

问题描述

试图做一个球拍问题来判断一个数字是否在列表中。出现错误

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

标签: racket

解决方案


Racket 使用前缀表示法。这使得逗号变得不必要。首先,一些语法:

如何定义一个函数?

( define ( name variable1 variable2 ) body )

wherename是函数名,variables 是参数。后面是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 )

如果 question-expression 的值不为 false,则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)))

... 等等。阅读Racket Guide了解该语言的语法、语义和数据类型的基本知识。


修复所有语法仍然会导致一个错误:无限循环。那是因为递归调用不在cdr列表上调用。所以递归调用永远在同一个列表(不是更短的列表)上进行。包装 acdr并修复语法会导致正确的功能。

#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

推荐阅读