我正在尝试为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的开头?
这么小的问题有很多文字。 我不需要代码只是一个很好的暗示我如何解决这个问题。 提前谢谢。
答案 0 :(得分:0)
快速修复以保持代码大致不变:
提供第三个解码参数,即完整树。始终将整个树作为第三个参数传递给下一个调用。在你开始一封新信的递归调用时,你将完整的树传递给atree,这样你就不会在树的中间开始一个新的字母了。
需要更多工作的修复,但会使(在我看来)更清洁,更好的程序:
在解码功能中,使用您已经完成的解码字符功能。解码函数没有理由需要知道树结构。您可以从decode-character获取第一个字符,然后使用在下一个'/或'_