0

スキームを使用して、キー [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))
  )
)

関数を実行してテストすると、何も返されません。私は何を間違っていますか?

4

1 に答える 1

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))))))
于 2013-11-07T03:24:23.420 に答える