2013-11-07 3 views
0

Im работает над программой Ngrams и им, не имея проблем с заполнением моей хэш-таблицы. Я хочу выписать рекурсивную функцию, которая примет слова и добавит их в хэш-таблицу. Предполагаемый способ работы задается набором данных 1 2 3 4 5 6 7 первая запись в хеш-таблице должна иметь ключ [1 2], а данные должны быть 3. Вторая запись должна быть: [2 3] и его данные должны быть 4 и продолжаться до конца текстового файла.Использование хеш-таблиц в ракетке

Нам предоставляется предопределенная функция, называемая readword, которая просто вернет 1 слово из текста. Но я не уверен, как эти вызовы перекрывают друг друга. Призывы будет выглядеть примерно так, если данные были жестко закодированы в.

(hash-set! (list "1" "2") 3 
(hash-set! (list "2" "3") 4 

2 вызовы, которые ив пытался выглядеть так

(hash-set! Ngram-table(list((word1) (word2)) readword in))) 
    (hash-set! Ngram-table(append((cdr data) word1)) readword in) 

по-видимому, после readword предполагается сообщить компьютеру что это и вводится вместо вывода или что-то в этом роде.

Как бы это назвать, чтобы данные в ключе хеш-таблицы перекрывались? И как выглядит рекурсивный вызов?

Редактировать: также нам не разрешено использовать утверждения утверждения в этой программе.

+0

Что произошло, когда вы сделали эти звонки? Вы получили сообщение об ошибке? Что это было? –

+0

Не является ли 'hash-set!' Оператором присваивания? В конце концов, это _assigning_ значение для записи в хеш-таблице. –

+0

Я havent получил, что работает еще, потому что я не уверен, как использовать хэш-таблицу. Я понимаю, как работает вызов хэш-таблицы, и это не проблема. То, что у меня есть, состоит в том, как точно вызвать хеш-таблицу, чтобы заставить ее правильно назначить данные. – user2963128

ответ

0

Во-первых, для тестирования мы определим процедуру readword, которая возвращает последовательные слова из списка. (В этом случае это всего лишь список номеров, но это не очень важно.) У вас уже есть один из них, но нам нужно сделать отдых работы кода. Это использует назначение (set!), но это не код, который вам действительно нужно написать; это просто для того, чтобы остальная часть этого ответа работала.

(define words (list 1 2 3 4 5 6)) 

(define (readword) 
    (cond 
    ((null? words) words) 
    (else (let ((word (car words))) 
      (set! words (cdr words)) 
      word)))) 
> (readword) 
1 
> (readword) 
2 

Теперь мы можем определить основную функцию, которая создает, заполняющий с помощью readword, и возвращает хэш-таблицу. insert-words имеет внутреннюю вспомогательную функцию, которая предполагает, что два слова уже были прочитаны, и поэтому ему нужно только прочитать следующее слово. Наша функция readword возвращает (), когда больше нет слов для чтения, поэтому наша вспомогательная функция останавливается, когда readword возвращает () и просто возвращает ngrams. В противном случае readword вернул слово, и мы можем добавить запись в хеш-таблицу с hash-set!, как в (hash-set! ngrams (list w1 w2) w3). После этого мы снова вызываем вспомогательную функцию, но с w2 и w3 в качестве двух предыдущих слов, для которых требуется третий.

(define (insert-words) 
    (define (insert-helper ngrams w1 w2) 
    (let ((w3 (readword))) 
     (cond 
     ((null? w3) ngrams) 
     (else 
     (hash-set! ngrams (list w1 w2) w3) 
     (insert-helper ngrams w2 w3))))) 
    (insert-helper (make-hash) (readword) (readword))) 
> (insert-words) 
'#hash(((1 2) . 3) ((3 4) . 5) ((4 5) . 6) ((2 3) . 4)) 

Этот вид модели с функцией хелперов, которая выполняет итерации является настолько общим, что схема и поддержка Ракетка что-то называется по имени пусть. Используя named let, это выглядит следующим образом. Я использовал имя loop, потому что это по существу цикл, но конкретное имя не имеет значения.

(define (insert-words) 
    (let loop ((ngrams (make-hash)) 
      (w1 (readword)) 
      (w2 (readword))) 
    (let ((w3 (readword))) 
     (cond 
     ((null? w3) ngrams) 
     (else 
     (hash-set! ngrams (list w1 w2) w3) 
     (loop ngrams w2 w3)))))) 
Смежные вопросы