1

モールス信号用のデコーダーをプログラムしようとしています。これまで、すべての文字のモールス信号を含むツリーを作成しました。

(define gap '/)
(define long-gap '_)
(define long '-)
(define short '*)

(define morsetree
(make-node "-" gap 
         (make-node "E" short
          (make-node "I" short 
           (make-node "S" short 
            (make-node "H" short empty empty)
            (make-node "V" long empty empty))
           (make-node "U" long 
             (make-node "F" short empty empty)
             empty))
          (make-node "A" long 
                     (make-node "R" short
                                (make-node "L" short empty empty)
                                empty)
                     (make-node "W" long 
                                (make-node "P" short empty empty)
                                (make-node "J" long empty empty))))

        (make-node "T" long 
         (make-node "N" short
          (make-node "D" short
           (make-node "B" short empty empty)
           (make-node "X" long empty empty))
          (make-node "K" long
           (make-node "C" short empty empty)
           (make-node "Y" long empty empty)))
         (make-node "M" long
          (make-node "G" short
            (make-node "Z" short empty empty)
            (make-node "Q" long empty empty))
          (make-node "O" long empty empty)))))

私は単一の文字のために動作するデコーダーを持っています:

(define (decode-character code atree)
  (cond
   ((symbol=? (first code) '*) (decode-character (rest code)(node-left atree)))
   ((symbol=? (first code) '-) (decode-character (rest code)(node-right atree)))
   ((symbol=? (first code) '/) (node-letter atree))))

しかし、単語のデコーダーが正しく機能しません。

 (define (decode code atree)
 (cond
 ((symbol=? (first code) '*) (decode (rest code)(node-left atree)))
 ((symbol=? (first code) '-) (decode (rest code)(node-right atree)))
 ((symbol=? (first code) '/) (cons (node-letter atree) (decode (rest code) atree)))

 ((and (symbol=? (first code) '_) (empty? (rest code))) 
                                          (cons (node-letter atree) (cons " " empty)))
((and (symbol=? (first code) '_) (not(empty? (first (rest code))))) (cons (node-letter atree)  (cons " " (decode (rest code) atree))))))

このテストの使用:(decode(list'-' /'*' *'/' *'_)morsetree)

デコーダーはツリー内の停止した位置に留まるため、(list "T" "I" "E" "")の代わりに(list "T" "D" "B" "")を与えます。したがって、'*' *の代わりに、デコードは'-'*'*を読み取ります。

文字が正常にデコードされた後、どうすればモールスツリーの先頭に「ジャンプ」できますか?

そのような小さな問題のためのたくさんのテキスト。この問題をどのように解決できるかについての良いヒントとして、コードは必要ありません。前もって感謝します。

4

1 に答える 1

0

コードをほとんど変更しないようにするための簡単な修正:
デコードする3番目のパラメーターを指定します。これは完全なツリーです。3番目の引数として、常にツリー全体を次の呼び出しに渡します。新しい文字を開始するときの再帰呼び出しでは、ツリー全体をツリーに渡すため、ツリーの途中で新しい文字を開始することはありません。

より多くの作業が必要になるが、(私の意見では)よりクリーンでより良いプログラムになる修正:
デコード関数内で、すでに作成したデコード文字関数を使用します。デコード関数がツリー構造について知る必要がある理由はありません。decode-characterから最初の文字を取得し、次の'/または'_の後に始まるコードでdecodeを呼び出すことができます。

于 2012-11-18T07:37:03.023 に答える