Racket 中的递归回溯?
Recursive backtracking in Racket?
不久前,作为概念证明(并且因为我正在与自闭症儿子一起使用 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
}
}
你可以看到一个讨论 here。我可以在 Logo 中轻松做到这一点,因为它允许使用 OUTPUT
命令从一个函数中多个退出点。
然而,Racket 不允许多个出口点(至少,不容易)。所以我希望有人指出一些 material 的方向,这将解释 (a) 如何管理一个函数的多个退出点(我有一个模糊的概念,我可以用延续来做到这一点,就像 let/ec
) 或 (b) 如何以更适合该语言的方式管理 Racket 中的递归回溯。
作为 Racket 的新手,我相信这可以由专家在眨眼之间完成,甚至可以由任何比我还不是新手的人完成。但是现在我为自己提供资金时感到非常难过。谢谢!
我认为这会起作用:
(define (hamilton p g)
(if (>= (number-of-vertices p)
(number-of-vertices g))
(first-and-last-vertex-adjacent? p)
(for/or ([v (in-vertices g)])
(and (not (belongs-to-path v p))
(not (adjacent v) (last-vertex p))
(hamilton (append-vertex p x) g)))))
不久前,作为概念证明(并且因为我正在与自闭症儿子一起使用 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
}
}
你可以看到一个讨论 here。我可以在 Logo 中轻松做到这一点,因为它允许使用 OUTPUT
命令从一个函数中多个退出点。
然而,Racket 不允许多个出口点(至少,不容易)。所以我希望有人指出一些 material 的方向,这将解释 (a) 如何管理一个函数的多个退出点(我有一个模糊的概念,我可以用延续来做到这一点,就像 let/ec
) 或 (b) 如何以更适合该语言的方式管理 Racket 中的递归回溯。
作为 Racket 的新手,我相信这可以由专家在眨眼之间完成,甚至可以由任何比我还不是新手的人完成。但是现在我为自己提供资金时感到非常难过。谢谢!
我认为这会起作用:
(define (hamilton p g)
(if (>= (number-of-vertices p)
(number-of-vertices g))
(first-and-last-vertex-adjacent? p)
(for/or ([v (in-vertices g)])
(and (not (belongs-to-path v p))
(not (adjacent v) (last-vertex p))
(hamilton (append-vertex p x) g)))))