使用递归的球拍列表错误

时间:2016-02-06 21:38:23

标签: racket

我正在尝试使用Racket中的列表来完成学校问题。这是一个使用递归的简单问题,但我无法理解为什么我的代码不起作用。如果提供的项目与列表中的项目匹配,我们应该搜索列表并返回true。这就是我到目前为止所做的:

(define (containsAnywhere test  list)
  (cond 
    ((null? list) '())
    (equal?((car list) test))
    (else(containsAnywhere (test (cdr list))))))

但是我收到以下错误:

application: not a procedure;
 expected a procedure that can be applied to arguments
  given: 1
  arguments.:

2 个答案:

答案 0 :(得分:2)

一些评论:

  • 不要调用您的参数list,这个名称的内置程序会以这种方式被遮蔽;在Scheme中,调用参数lst代替
  • 是很常见的
  • 你有很多括号错误 - 过程调用类似于(procedure param1 param2 ...)cond内的条件都在括号中
  • equal?谓词的尾随?
  • 并且您的代码缩进已关闭;使用Dr Racket" reindent all"特征
  • 我假设你的程序结果应该是True或False,所以空列表应该返回#f,而不是'()

这是您的代码的工作版本;在cond内部我将条件和表达式放在单独的行上,以便代码和括号变得更清晰:

 
(define (containsAnywhere test lst)
  (cond 
    ((null? lst)
     #f)
    ((equal? (car lst) test)
     #t)
    (else
     (containsAnywhere test (cdr lst)))))

或者,我会这样编码:

(define (containsAnywhere tst lst)
  (and (not (null? lst))
       (or (equal? (car lst) tst)
           (containsAnywhere tst (cdr lst)))))

答案 1 :(得分:0)

(test (cdr list))

在这里,您将test应用于参数(cdr list),就像test是一个函数一样,但事实并非如此。因此错误。

你的意思是(containsAnywhere test (cdr list)),它将test作为第一个参数传递给containsAnywhere,将(cdr list)传递给第二个参数。