2013-11-07 3 views
0

Я пытаюсь найти первый недостающий ключ в хэш-таблице, который должен содержать ключи [1 ... N], используя Схему.Перерыв цикла и возврата в схеме Racket

До сих пор, у меня есть следующий код:

(define (find-missing n ht) 
    (define c 1) 

    (let forVertices() 
    (cond (not (hash-has-key? ht c)) 
     (c) 
    ) 

    (set! c (+ c 1)) 
    (when (>= n c) (forVertices)) 
) 
) 

Когда я выполняю функцию, чтобы проверить это, ничего не возвращается. Что я делаю не так?

ответ

2

У вас есть пара проблем с круглыми скобками, и отсутствует случай else. Это должно исправить ошибки:

(define (find-missing n ht) 
    (define c 1) 
    (let forVertices() 
    (cond ((not (hash-has-key? ht c)) 
      c) 
      (else 
      (set! c (+ c 1)) 
      (when (>= n c) 
      (forVertices)))))) 

... Но вы должны знать, что, как вы написали процедуру не идиоматическое, вообще. В общем, на Схеме вам следует избегать мутирующего состояния (операция set!), вы можете написать эквивалентную процедуру, правильно настроив рекурсию и передав правильные параметры. Кроме того, рекомендуется возвращать что-либо при выходе из рекурсии (например: #f), в противном случае ваша процедура вернет #<void>, если ключей нет. Вот что я имею в виду:

(define (find-missing n ht) 
    (let forVertices ((c 1)) 
    (cond ((> c n) #f) 
      ((not (hash-has-key? ht c)) c) 
      (else (forVertices (+ c 1)))))) 
Смежные вопросы