2016-11-25 82 views
2

我想用會員?函數來確定用戶輸入中特定字符串的存在。球拍計劃 - 會員?功能難題

會員?功能使用方法是:

(define (member? item seq) 
    (sequence-ormap (lambda (x) 
        (equal? item x)) 
        seq)) 

然而,我的程序的結構需要我做以下對比:(?成員「(名稱)」(在壘的名字))

其輸出的下面是一個例子:

> (car (car *strong-cues*)) 
'((the names) (their names)) 
> (car (car (car *strong-cues*))) 
'(the names) 
> (member? (car (car (car *strong-cues*))) '(the names of the basemen)) 
#f 

「名字」顯然是在用戶的輸入(在這種情況下是「壘的名字」。)但是,我看到的問題是,這是wha t正在發生:

是(或名稱)或(或)'or'basemen?

有沒有一種方法可以正確地進行這種比較,如果「名稱」是用戶輸入內的字符串,那麼搜索「名稱」將返回true?

回答

3

這並不是真的member,因爲您正在搜索列表中的子列表。因爲你不能使用ormap,因爲每次迭代只有一個元素,而你期望比較幾個元素。我建議你prefix?

(define (prefix? what lst) 
    ; implementation left as exercise 
    <???>) 

(prefix? '(b c) '(a b c d)) ; ==> #f 
(prefix? '(b c) '(b c d)) ; ==> #t 

這是你比較元素元素,直到搜索列表是空的相當簡單的遞歸的事。如果每個元素測試都是錯誤的或乾草堆是空的,那就是錯誤的。然後你就可以很容易地find-sublist吧:

(define (find-sublist sub lst) 
    (cond ((null? lst) #f) 
     ((prefix? sub lst) lst) 
     (else (find-sublist sub (cdr lst)))))) 

(find-sublist '(c d) '(a b c d e f)) ; ==> (c d e f) 

在這裏,我返回的前綴,如成員做的名單,但可以很容易地改變到你想要它做的..指數,#t,等等。

+0

你的解釋很簡單,內容豐富。非常感謝你!! –