List 使用数据类型和递归在scheme中创建列表

List 使用数据类型和递归在scheme中创建列表,list,recursion,scheme,racket,List,Recursion,Scheme,Racket,我目前正在学习Scheme,刚刚学习了归纳集和递归。我目前定义了一个数据类型bTree,它是一个二叉树 (define-datatype bTree bTree? (leaf (datum number?)) (node (value symbol?) (left bTree?) (right bTree?))) 这很好用。我想创建一个函数,当给定一个bTree时,它将返回一个从根(也是列表)到每个叶子的路径列表,其中左用0表示,右用1表示 (defin

我目前正在学习Scheme,刚刚学习了归纳集和递归。我目前定义了一个数据类型bTree,它是一个二叉树

(define-datatype bTree bTree?
  (leaf
    (datum number?))
  (node
    (value symbol?)
    (left bTree?)
    (right bTree?)))
这很好用。我想创建一个函数,当给定一个bTree时,它将返回一个从根(也是列表)到每个叶子的路径列表,其中左用0表示,右用1表示

(define bTree-path
  (lambda (tree)
(cases bTree tree
  (leaf (datum) '())
  (node (value left right)
          (list (cons 0 (bTree-path left)) (cons 1 (bTree-path right)))))))
我的想法是,如果它看到一片叶子,它不会返回任何内容到当前列表。但是,如果它是一个节点,则会创建一个新列表。在此列表中,使用cons运算符分别为0和1(表示在步骤左侧和步骤右侧)递归调用左、右侧子树的函数。这很快被证明是错误的,因为测试树包含嵌套列表。结果应该类似于((01)(00)(1)),这意味着有3片叶子可以通过向左走两次、向右走一次或向左然后向右找到

从叶子到根的工作不起作用,因为你不知道叶子是左叶还是右叶。每次找到节点时调用列表都会导致嵌套。有没有一种方法可以简单地使用两个带有左右子树的递归调用同时调用两个列表?可能是函数或操作?

由于
(b树路径左)
的结果是(或至少应该是)从
到该子树叶子的所有路径的列表,因此需要将
0
添加到这些路径中的每一个。
对于右子树也是如此

对列表中的每个元素执行操作的函数是
map

(map (lambda (path) (cons 0 path)) (bTree-path left))
接下来,您要将两个路径列表(从左到右)合并到一个列表中,执行此操作的函数是
append


把所有这些放在一起作为练习。

谢谢您的回答。我应用了append函数,左取一个map函数,右取一个map函数,但结果返回一个空集。难道append不需要两个列表并将它们变成一个这样的列表:(append'(12)'(34))返回'(1234)?如果我有路径(01)(11)和(1),我想append会把它们变成(01)。@user3261941很容易找到:在DrRacket的交互窗口中玩
append
(或你最喜欢的其他REPL)。