2013-10-13 4 views
0

я сделал программу, которая ищет, если элемент является частью списка, но он не работает со словами Моя программа:схема, поиск, если слово является частью списка

(define (element? xs lst) 
    (cond ((null? lst) #f) 
     ((eq? xs (car lst)) #t) 
     (#t (element? x (cdr lst))))) 

примеры :

>(element? 'three (quote ((quote three) (quote four) (quote five)))) 
>,=> #f but i need #t 

, пожалуйста, помогите.

+1

в последнем строка, не должна 'x' быть' xs'? – japreiss

+0

это просто ошибка, но даже с xs вместо x она не работает. –

ответ

-1

eq? проверяет, находятся ли два объекта в одном месте. Это фактически не сравнивает значения. Если вы построите идентичные строки в двух разных ячейках памяти, eq? возвращает false. Вместо этого используйте string=.

Я хотел показать некоторые примеры кода, но схема агрессивно интернирования строк, и я не могу получить два отдельно выделяются одинаковые строки существовать ...

Relevant question

+0

Символы, такие как 'three', сопоставимы с' eq? '. Проблема OP состоит в том, что _symbol_ 'three' не' eq? 'В _list_' (цитата три)' –

+0

И знаете ли вы, как решить эту проблему? –

+0

@DenGarif Я не уверен, было ли это замечание направлено ко мне или japreiss, но [ответ Сильвеера] (http://stackoverflow.com/a/19350157/1281433), и комментарии к нему объясняют, как решить эту проблему. Как правило, элементы списка считаются «машинами» ячеек списка. Таким образом, элементы '((quote one) (quote two))' являются _lists_ '(quote one)' и '(quote two)'. Два не являются элементом списка. Ответ Сильвестера объясняет, как найти элемент в _tree_ из cons-клеток; и 'two' _is_ - элемент в дереве' ((quote one) (quote two)) '. –

1

Когда схема встречает (quote x) или короткая Форма 'x x - результат неоценимый. Таким образом, (quote ((quote three) (quote four) (quote five))) становится списком ((quote three) (quote four) (quote five)). Думаю, вы хотели пройти (quote (three four five)), который вы могли бы написать '(three four five), и ваша процедура сработала бы с тех пор, как вы искали первый элемент.

Ошибка при наличии несвязанной переменной, которая не работает, если искомый элемент не является первым элементом в lst. x, который, как я полагаю, фактически должен быть связанной переменной xs. Я переименовал каждый xs к x (так как хз обычно означает, что список и здесь это поиск элемента)

(define (element? x lst) 
    (cond ((null? lst) #f) 
     ((eq? x (car lst)) #t) 
     (else (element? x (cdr lst))))) 

(element? 'c '(a b c d e f)) ; ==> #t 
(element? 'g '(a b c d e f)) ; ==> #f 
(element? (quote e) (quote (a b c d e))) ; ==> #t 

Если вы действительно хотите, чтобы искать другие вещи, чем символы, вы должны использовать equal? вместо eq?, например:

(define (element? x lst) 
    (cond ((null? lst) #f) 
     ((equal? x (car lst)) #t) 
     (else (element? x (cdr lst))))) 

(element? '(hello dolly) '((hello paul) (hello dolly) (hello todd))) ; ==> #t 
+0

Да, он работает правильно с формой вроде> (элемент?«один» (один два три)), но он не работает с> (quote ((цитата одна) (цитата из двух) (цитата три))) вместо> '(один два три)) –

+0

'(quote (one два три)) '- это то же самое, что' '(один два три)'. '(quote() (цитата одна) (quote two) (quote three)))' такая же, как ''((цитата одна) (цитата 2) (цитата три))', но цитата в этом последнем списке - всего лишь символ как привет в '(hello dolly)' и ничего особенного. Вам нужно только одну цитату для одного выражения, чтобы процитировать ее, а не по одному для каждого элемента. – Sylwester

0

В схеме действительно нет понятия «слова» - у вас есть символы или строки. Из того, что вы написали, вы хотите найти символы. Ваш код имеет ряд простых ошибок, вот простой вариант:

(define (element? xs lst) 
    (and (not (null? lst)) 
     (or (eq? xs (car lst)) 
      (element? xs (cdr lst))))) 


> (element? 'three (list 'three 'four 'five)) 
#t 

Примечание: В любое время вы видите cond возвращающихся значения #t или #f вы можете предпочесть перезаписи с точкой зрения and и or

+0

Почему нужно выбирать и/или кончать? – uselpa

+0

, но он не работает с: ** (element? 'Three (quote ((quote three) (quote four) (quote five)))) ** @GoZoner –

+0

Использование: '(element?' Three (list (quote три) (цитата из четырех) (цитата пять))) 'Если вы удовлетворены, предоставьте« галочку »и« голосование »(когда это возможно). – GoZoner

Смежные вопросы