我正在编写一个程序,将机器人从BST指向目标号码。该程序有两个输入参数,一个目标作为整数,一个地图代表机器人可以遵循的所有路径。
ie :(机器人64'(53(()(64()())))))
其中64是目的地,53(()(64()())))是BST。
我需要帮助编写方法。这是我最初的工作。
(define (robot goal map)
(let ((x (car map)))
(define empty? '())
(display x)
(cond (empty? x)
(robot goal (cadr map)))
(cond ((= goal x)) (display x))
(cond (< x goal)
(robot goal (cadr map)))
(cond (> x goal)
(robot goal (caddr map)))
;(display "NULL")
)
)
它应该搜索BST,如果找到了路径,它会打印(找到:#T#T ...#T#),如果你的目的地在树中而不是根目录(#是一个位置)数字和T是L或R,表示您在#位置左转或右转。
注意:直到昨天我才使用过Lisp,如果我有点失落,那就很抱歉。
答案 0 :(得分:1)
程序的结构对于手头的问题是不正确的 - 您没有正确处理递归,并且您没有为请求的输出构建一个列表。这也不是使用cond
的正确方法,您不应重新定义现有程序map
和empty?
。此外,如果元素不在树中会发生什么?在确定树是非空的之前,你不能(car tree)
。
我将提供正确的解决方案结构并给你一些提示,这样你就可以自己计算解决方案,如果在树中找不到元素,我们将返回一个值为{{1}的列表在最后一个位置。
not-found
请注意,搜索BST的正确方法始终是:
作为最后的建议,不要忘记测试你的解决方案:
(define (robot goal tree)
(cond ((empty? tree) ; if the tree is empty
'(not-found)) ; return special value indicating it
((= <???> goal) ; if the current element is goal
<???>) ; return a list with current element
((< goal <???>) ; if goal is less than current element
(cons <???> ; cons current element
(cons <???> ; with L and advance the recursion
(robot goal <???>)))) ; going to the left
(else ; otherwise
(cons <???> ; cons current element
(cons <???> ; with R and advance the recursion
(robot goal <???>)))))) ; going to the right