モールス信号用のデコーダーをプログラムしようとしています。これまで、すべての文字のモールス信号を含むツリーを作成しました。
(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" "")を与えます。したがって、'*' *の代わりに、デコードは'-'*'*を読み取ります。
文字が正常にデコードされた後、どうすればモールスツリーの先頭に「ジャンプ」できますか?
そのような小さな問題のためのたくさんのテキスト。この問題をどのように解決できるかについての良いヒントとして、コードは必要ありません。前もって感謝します。