这是函数应该做的事情:
我给它的“对”列表看起来像(((a.b).c)((a.b).c)((a.b)。c)...) 其中:
a表示如果顶点被访问1表示是0表示没有
b表示到目前为止到顶点的最短路径的值是多少(如果它是-1,它是无穷大)
c是父母的编号(如果它不存在,如果它是第一对,如果你将第一对计算为1秒,等于2,等等。)
该函数应该返回到目前为止具有最低路径成本的下一个未访问对(顶点)的编号。 例: (((0.10).1)((0.4).2)((1.3).5)......)这里它应该返回数字2.
这是代码
(define (chooseNextLowest pairs num retV pointer)
(if (null? pairs)
retV
(if (checkIfPairVis (caar pairs))
(chooseNextLowest (cdr pairs) num retV (+ 1 pointer))
(if (= -1 num)
(chooseNextLowest (cdr pairs) (cdaar pairs) pointer (+ 1 pointer))
(if (not (= -1 (cdaar pairs)))
(if (< (cdaar pairs) num)
(chooseNextLowest (cdr pairs) (cdaar pairs) pointer (+ 1 pointer))
(chooseNextLowest (cdr pairs) num retV (+ 1 pointer))))))))
我已经使用了一些预定义的功能,但我认为他们的名字很清楚他们做了什么。 我用num = -1,retV = -1和指针= 1来调用它,因为我使用-1表示无穷大,我确信retV将至少改变1次因为每次调用此函数时至少会有1个未访问对
它们工作正常当我将它与一些testPairs一起使用时,这个函数看起来工作得很好但是当我使用从其他函数返回的对时(因为我必须在每次更新信息后选择最低成本的未访问顶点)对)它不会返回任何值。
也许你会要求看到另一个功能,但我现在不能给它,因为如果我给它,我必须给出完整的代码才能理解,所以我希望错误在某处,但我可以找不到。
其他函数返回我想要的类型中的正常对((a.b).c)等。
非常感谢你。我确信我没有说清楚,所以如果你有问题可以随意问我。
答案 0 :(得分:2)
格式化代码之后很明显,在第二深if
中你缺少另一种选择。没有替代方案的if
在Scheme中是非常新的,但是:
(if #f 'true) ;; ==> #undefined
查看您的代码,特别是checkIfPairVis
,您似乎可以caar
,但对于该对象可以,但对于包含对象的列表则没有。消除此类事情的最佳方法是在代码中创建访问器,这也将使您的代码更易于阅读:
(define (choose-next-lowest pairs num ret-v pointer)
;; accessor based on object
(define vertex-visited caar)
(define vertex-shortest cdar)
(define vertex-parents cdr)
(if (null? pairs)
ret-v
(let ((obj (car pairs)))
(cond
((check-if-pair-vis (vertex-visited obj))
(choose-next-lowest (cdr pairs) num ret-v (+ 1 pointer)))
...))))
在修复了那个访问者之后,我按照你的预测得到了2。 当然可能是其他错误。在我看来你需要调试。在DrRacket IDE中,您可以单步执行代码以确保其按设计运行。
PS:命名为let将添加您不需要公开的累加器和变量:
(define (choose-next-lowest pairs)
(define vertex-visited caar)
(define vertex-shortest cdar)
(define vertex-parents cdr)
(define (vertex-visited? v)
(= 1 (vertex-visited v)))
(let rec ((pairs pairs) (num -1) (ret-v -1) (pointer 1))
(if (null? pairs)
ret-v
(let ((obj (car pairs)))
(cond
((vertex-visited? obj) (rec (cdr pairs) num ret-v (+ 1 pointer)))
((= -1 num) (rec (cdr pairs) (vertex-shortest obj) pointer (+ 1 pointer)))
((= -1 (vertex-shortest obj)) 'undefined) ;; something wrong here?
((< (vertex-shortest obj) num) (rec (cdr pairs) (vertex-shortest obj) pointer (+ 1 pointer)))
(else (rec (cdr pairs) num ret-v (+ 1 pointer))))))))
(choose-next-lowest '(((0 . 10) . 1) ((0 . 4) . 2) ((1 . 3) . 5))) ; ==> 2
答案 1 :(得分:0)
您在(if (not (= -1 (cdaar pairs))) ...
的条件只有一个后续条款。如果没有替代子句,则if
的返回未定义(正式)。具体做法是:
(if (not (= -1 (cdaar pairs)))
(if (< (cdaar pairs) num)
(chooseNextLowest (cdr pairs) (cdaar pairs) pointer (+ 1 pointer))
(chooseNextLowest (cdr pairs) num retV (+ 1 pointer)))
<something here>)))))
说明if
如何获得未定义的回报:
> (if #f 'yes 'no)
no
> (if #f 'yes)
> ; <= nothing printed as a return, just a prompt displayed.