Math 哈密顿路径函数意外返回空路径

Math 哈密顿路径函数意外返回空路径,math,clojure,Math,Clojure,我正在努力解决的任务是基于一个名为骑士之旅的问题和这个数字文件视频: 基本上,我在这里要做的是编写一个助手函数,递归地计算给定图(V,E)中的哈密顿路径。它应该按照路径的顺序返回V中的元素列表,如果不存在这样的路径,则返回nil。但它只返回路径P的空列表 到目前为止,我的尝试(更进一步):(而且格式有点奇怪) (defn-H' ;; 这是计算哈密顿路径的辅助函数。 ;E是关系,即图,我们在其中寻找路径。 ;a是当前节点。 ;S是我们尚未访问的节点集。 P是我们迄今为止走过的道路。 ;;

我正在努力解决的任务是基于一个名为骑士之旅的问题和这个数字文件视频:

基本上,我在这里要做的是编写一个助手函数,递归地计算给定图(V,E)中的哈密顿路径。它应该按照路径的顺序返回V中的元素列表,如果不存在这样的路径,则返回nil。但它只返回路径P的空列表

到目前为止,我的尝试(更进一步):(而且格式有点奇怪)

(defn-H'
;; 
这是计算哈密顿路径的辅助函数。
;E是关系,即图,我们在其中寻找路径。
;a是当前节点。
;S是我们尚未访问的节点集。
P是我们迄今为止走过的道路。
;;      
;H'应该返回通过E的哈密顿路径
从P开始,然后经过a,然后访问每个顶点
在布景中。
;如果不存在这样的路径,则应返回nil。“
;; 
[行政长官]
;;     
{ 
:pre[
(非(包含?S a))
(不包含(集合P)a))
(空?(交叉点S(集合P)))
]
:邮政[
(或(空?%)(=(集%)(并集S(集P)#{a})))
(或(空?%)(=(计数%)(+(计数S)(计数P)1)))
]
}
;(ea的图像)返回远离当前顶点的边集
我的尝试:
(如果不是(空的?S)
(如果(一些#)(HE%(DISJS%)P)(交叉点(EAS的图像))
(concat P[a])
)
)
)
(定义H
计算图(V,E)中的哈密顿路径;返回图中V中元素的列表
该路径的顺序,如果不存在该路径,则为零”
[ve]
(部分#(H'E%(disj V%))V)
)
我不明白为什么我没有从H得到任何路径p,只是一个空列表?我是在错误的条件下终止递归还是类似的情况?某个函数的谓词是否表述错误


如果有什么需要进一步澄清或需要更多代码,请告诉我。

怎么了?

剥离到最低限度

(defn- H' [E a S P]
  (if (seq S)
    (if (some #(H' E % (disj S %) P) (intersection (image-of E a) S))
      (concat P [a]))))
。。。其中
(如果不是空的话)
简化为
(如果是空的话)

考虑
n
,即
S
中的元素数

  • 如果
    n
    为零,
    H'
    返回
    nil
  • 如果
    n
    为正,则结果是
    H'
    调用
    S
    的元素数为
    n-1
因此,
H'
为所有
S
返回
nil

用Don Knuth的话说,“我没有试过,我只是证明了这一点。”

纠正错误

(H'easp)
应该返回从
a
开始通过顶点
S
的哈密顿路径。上述函数通过
S
计算该路径:

(some #(H' E % (disj S %) P) (intersection (image-of E a) S))
。。。然后把它扔掉

我们要做的是在它的前面钉上一个,以遵守归纳承诺:

(defn- H' [E a S P]
  (if (seq S)
    (let [tail (some #(H' E % (disj S %) P) (intersection (image-of E a) S))]
      (and tail (cons a tail)))
    (list a)))
。。。其中,
处理找不到路径的问题

注意

  • 我还没试过这个
  • 有更好的表达方式,我已经尝试过了

怎么了?

剥离到最低限度

(defn- H' [E a S P]
  (if (seq S)
    (if (some #(H' E % (disj S %) P) (intersection (image-of E a) S))
      (concat P [a]))))
。。。其中
(如果不是空的话)
简化为
(如果是空的话)

考虑
n
,即
S
中的元素数

  • 如果
    n
    为零,
    H'
    返回
    nil
  • 如果
    n
    为正,则结果是
    H'
    调用
    S
    的元素数为
    n-1
因此,
H'
为所有
S
返回
nil

用Don Knuth的话说,“我没有试过,我只是证明了这一点。”

纠正错误

(H'easp)
应该返回从
a
开始通过顶点
S
的哈密顿路径。上述函数通过
S
计算该路径:

(some #(H' E % (disj S %) P) (intersection (image-of E a) S))
。。。然后把它扔掉

我们要做的是在它的前面钉上一个,以遵守归纳承诺:

(defn- H' [E a S P]
  (if (seq S)
    (let [tail (some #(H' E % (disj S %) P) (intersection (image-of E a) S))]
      (and tail (cons a tail)))
    (list a)))
。。。其中,
处理找不到路径的问题

注意

  • 我还没试过这个
  • 有更好的表达方式,我已经尝试过了

您不应该在函数名中使用单引号
。删除该选项并重试,然后更新您的问题。另请参阅此模板项目中的文档资源列表(可能将代码放入现有文件中以尝试运行它)(&maybe):嗯?这个函数有很多问题,但它的名称不是其中之一。这个名称是赋值中代码框架的一部分,它可以工作并且可以运行。我只是在这里发布了一些代码片段,因为我不想发布一堆代码。您不应该在函数名中使用单引号
'
。删除该选项并重试,然后更新您的问题。另请参阅此模板项目中的文档资源列表(可能将代码放入现有文件中以尝试运行它)(&maybe):嗯?这个函数有很多问题,但它的名称不是其中之一。这个名称是赋值中代码框架的一部分,它可以工作并且可以运行。我只是在这里发布代码片段,因为我不想发布代码墙。