不久前,作为概念证明(并且因为我和自闭症儿子一起使用 Logo),我在 Logo 中编写了一个程序,使用回溯方法在图中(如果存在)找到哈密顿回路。我使用的基本回溯模式是:
boolean hamilton(path p, graph g)
{
if p has as many vertices as g
{
if the last and first vertices in p are adjacent,
return true
else
return false
}
else
{
for each vertex x of g not in p and adjacent to the last vertex of p
{
if hamilton(path p + x,graph g) succeeds,
return true
}
return false
}
}
你可以在这里看到一个讨论。OUTPUT
我可以在 Logo 中轻松地做到这一点,因为它允许使用命令从函数中获得多个退出点。
但是,Racket 不允许多个退出点(至少,不容易)。所以我希望指出一些材料的方向,这些材料可以解释(a)如何管理一个函数的多个退出点(我有一个模糊的概念,我可以用延续来做到这一点,如let/ec
)或(b)如何以更适合该语言的方式管理 Racket 中的递归回溯。
作为 Racket 的新手,我相信这可以由专家在眨眼间完成,甚至可以由比我更初级的任何人完成。但现在我为自己感到困惑。谢谢!