2016-02-06 38 views
0

我想在球拍中使用列表完成一个学校问题。这是一个简单的问题使用递归,但我不明白为什么我的代码不会工作。如果提供的项目与列表中的项目匹配,我们应该搜索列表并返回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.: 

回答

0
(test (cdr list)) 

这里你申请test的说法(cdr list)仿佛test是一个函数,但不是。因此错误。

你大概是指(containsAnywhere test (cdr list)),它通过test作为第一个参数containsAnywhere(cdr list)作为第二个。

2

几点意见:

  • 不打电话给你的参数list,有将被隐藏这样该名称的内置的程序;方案很常见调用参数lst代替
  • 你有很多括号错误的 - 过程调用就像(procedure param1 param2 ...),里面cond条件括号内为
  • equal?谓词具有后?
  • 和你的代码的缩进是关闭的;使用DR球拍的“缩进所有”功能
  • 我假设你的程序的结果应该是真或假,所以空单应返回#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)))))