我正在尝试使用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))
)
)
当我执行测试它的函数时,不返回任何内容。我做错了什么?
答案 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))))))