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)
(作为一个函数)应用于子树的根值。哦,那么它应该是什么来代替根值呢?