列出所有哈夫曼树的叶子

问题描述 投票:2回答:1

这是我的霍夫曼编码,它返回一个空列表。我的目的是让它将所有对添加到listenr1但它接缝只返回一个空列表。我不确定为什么它不会附加,但我认为我误解了Scheme编程的一个基本部分。我不想使用append*。我认为附加可能是错误的,但我不确定为什么。有没有办法在每次附加时替换listenr1

(define (huffman-leafs tree)
  (let ((listenr1 '()))
    (define (iterator currentbranch)
      (let ((left (left-branch currentbranch))
            (right (right-branch currentbranch)))
        (if (leaf? left)
            (list (symbols left) (weight left))
            (append listenr1 (iterator left)))
        (if (leaf? right)
            (list (symbols right) (weight right))
            (append listenr1 (iterator right)))))
    (iterator tree)
    listenr1))

(huffman-leafs mytree)
list append scheme huffman-code r5rs
1个回答
0
投票

你写的代码看起来是一个好的开始,但它混合了递归和非递归的习语。

霍夫曼树(我假设)要么是LEAF?在这种情况下它有SYMBOLS和WEIGHT。否则它有LEFT-BRANCH和RIGHT-BRANCH。

所以我们可以定义一个递归函数来列出所有叶子,如下所示:

(define (huffman-leafs tree)
  (if (leaf? tree)
      ;;; list this leaf alone
      ;;; else, use recursion (huffman-leafs (left-branch tree)) and right branch
      ;; and APPEND those together
      ))

希望有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.