我正在创建一个程序,它接受一个树并随机选择一个分支(左或右)并在列表中返回这些值。由于某种原因,它不起作用。有什么帮助吗?
示例:
~(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))) '())))))
答案 0 :(得分:1)
免责声明:我从未在计划中写过,但15年前我与LISP进行了短暂的会面=)
您的递归部分不是递归的。您应该在子树上调用rand-walk
并cons
。
(cons ((root-value tr)(rand-walk (left-subtree tr))) '())
(cons ((root-value tr)(rand-walk (right-subtree tr))) '())))))
答案 1 :(得分:1)
如果你想遍历它,那么当你到达一片叶子时你应该返回一个列表:
(if (leaf? tr) (cons tr '())
在你的递归步骤中,你应cons
进行一些递归调用:
(cons (root-value tr) (rand-walk (left-subtree tr)))
答案 2 :(得分:1)
您的代码中存在许多问题。这是一个正确的实现:
(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))))))