在Racket Scheme中打破循环并返回

时间:2013-11-07 03:16:39

标签: function loops scheme return racket

我正在尝试使用Scheme在哈希表中找到第一个缺少的键,它应包含键[1 ... N]。

到目前为止,我有以下代码:

(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))
  )
)

当我执行测试它的函数时,不返回任何内容。我做错了什么?

1 个答案:

答案 0 :(得分: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))))))

...但你应该知道你编写程序的方式根本不是惯用的。通常,在Scheme中你应该避免改变状态(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))))))