2016-02-06 59 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)))))