Random 随机遍历二叉树?

Random 随机遍历二叉树?,random,tree,scheme,binary-tree,Random,Tree,Scheme,Binary Tree,我正在制作一个程序,它取一棵树,随机选取一个分支(左或右),并在列表中返回这些值。由于某种原因,它不起作用。有什么帮助吗 例如: ~(rand-walk (tree 1 (leaf 2) (leaf 3))) (1 2) 这就是我到目前为止所做的: (define (rand-walk tr) (if (empty-tree? tr) '() (if (leaf? tr) tr (if (equal? (random 1) 0) (cons ((

我正在制作一个程序,它取一棵树,随机选取一个分支(左或右),并在列表中返回这些值。由于某种原因,它不起作用。有什么帮助吗

例如:

~(rand-walk (tree 1 (leaf 2) (leaf 3)))
(1 2)
这就是我到目前为止所做的:

(define (rand-walk tr)
 (if (empty-tree? tr) '()
   (if (leaf? tr) tr
      (if (equal? (random 1) 0)
              (cons ((root-value tr)(root-value (left-subtree tr))) '())
              (cons ((root-value tr)(root-value (right-subtree tr))) '())))))

免责声明:我从未使用Scheme编写过,但大约15年前我曾与LISP有过一次短暂的接触=)

您的递归部分不是递归的。您应该在子树上调用
rand walk
,然后
cons
ing

          (cons ((root-value tr)(rand-walk (left-subtree tr))) '())
          (cons ((root-value tr)(rand-walk (right-subtree tr))) '())))))

如果要遍历它,则在到达叶子时应返回一个列表:

(if (leaf? tr) (cons tr '())
在递归步骤中,您应该使用一些递归调用
cons

(cons (root-value tr) (rand-walk (left-subtree tr)))

您的代码中有许多问题。下面是一个适当的实现:

(define (rand-walk tr)
 (cond ((empty-tree? tr) '())
       ((leaf? tr) (list (root-value tr)))
       ((equal? (random 1) 0)
        (cons (root-value tr) (rand-walk (left-subtree tr))))
       (else
        (cons (root-value tr) (rand-walk (right-subtree tr))))))
如果我写这篇文章,我会使用尾部递归方法:

(define (rand-walk tr)
  (assert (not (empty-tree? tr)))
  (let walking ((l '()) (tr tr))
    (let ((value (root-value tr)))
      (if (leaf? tr)
          (reverse (cons value l))
          (walking (cons value l))
                   ((if (zero? (random 1)) left-subtree right-subtree) tr))))))

谢谢分享你的代码。你有问题吗?对不起。我忘了添加我的问题。我不知道如何返回列表中的值。只有子树返回,我甚至不知道scheme,但在我看来,你们并没有进行任何递归调用。
rand walk
不应该被递归调用吗?如果你在树中存储数字,你发布的代码不会返回任何东西-它有一个运行时错误,因为你正在将
(根值tr)
(作为一个函数)应用于子树的
根值。哦,那么它应该是什么来代替根值呢?