莫尔斯解码器用于单词

时间:2012-11-16 19:36:01

标签: tree racket morse-code

我正在尝试为morse代码编写解码器。 到目前为止,我已经创建了一个包含所有字母的morsecode的树。

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

使用此测试:     (解码       (列出' - '/'*'*'/'*'_)morsetree)

给我(列出“T”“D”“B”“”)而不是(列出“T”“I”“E”“”),因为解码器停留在它停止的树中的位置。因此,代替'*'*解码读取' - '*'*。

在成功解码信件后,如何“跳”到我的morsetree的开头?

这么小的问题有很多文字。 我不需要代码只是一个很好的暗示我如何解决这个问题。 提前谢谢。

1 个答案:

答案 0 :(得分:0)

快速修复以保持代码大致不变:
提供第三个解码参数,即完整树。始终将整个树作为第三个参数传递给下一个调用。在你开始一封新信的递归调用时,你将完整的树传递给atree,这样你就不会在树的中间开始一个新的字母了。

需要更多工作的修复,但会使(在我看来)更清洁,更好的程序:
在解码功能中,使用您已经完成的解码字符功能。解码函数没有理由需要知道树结构。您可以从decode-character获取第一个字符,然后使用在下一个'/或'_

之后开始的代码调用decode