Scheme函数不返回值

时间:2013-12-27 00:22:13

标签: function scheme

这是函数应该做的事情:

我给它的“对”列表看起来像(((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)等。

非常感谢你。我确信我没有说清楚,所以如果你有问题可以随意问我。

2 个答案:

答案 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.