“mcar:合同违规”对Scheme的新手需要一些答案:)

时间:2013-12-23 12:17:43

标签: graph scheme

我是Scheme的新手,我有一些问题。

首先,我想制作一个图形,然后将其用于某些东西(如Dijkstra等)。首先,我想创建一个返回Vertexes计数的函数(不确定这是否是一个单词)。但我得到了这个错误,我只是无法意识到它是什么以及为什么我得到它。

此外,当我得到顶点的数量时,我希望每对配对列表都会给出给定顶点的信息,但我不知道该怎么做。

(例如,如果列表应该有4个顶点((0,-1)(0 -1)(0 -1)(0 -1))“ - 1”将像无穷大一样,因为没有0以下的“权重”

我确信有1182498个更好的方法来做算法,但我想试试我的想法。但我仍然没有足够的经验。

以下是我的错误代码:

(define G '((A (B 6) (E 5)) 
        (B (D 3)) 
        (C (A 1) (D 1))
        (D (C 7) (E 5) (W 3)) 
        (E (D 4) (F 10)) 
        (F)
        ))
(define (getNumV G)
(if (null? (car G)) 0)
(+ 1 (getNumV (cdr G))))

1 个答案:

答案 0 :(得分:0)

如果列表为空,则无法使用car,因此测试只是(null? G),而不是(null? (car G))

另外,在0之后你有一个右括号是错误的,都是关于逻辑的,因为在Scheme中if需要有一个 else 部分(您可以使用whenunless来避免这种情况。)

所以代码应该是

(define (getNumV G)
  (if (null? G)
      0
      (+ 1 (getNumV (cdr G)))))

这样

(display (getNumV G))
=> 6

另外,请尝试正确缩进代码,并且不要悬空结束括号。

为您的程序的list参数使用通用名称会更加清晰,例如lst,而不是真实列表G的名称:

(define (getNumV lst)
  (if (null? lst)
      0
      (+ 1 (getNumV (cdr lst)))))

(display (getNumV G))
=> 6

请注意,您可以使用内置程序length代替getNumV

(display (length G))
=> 6