Graph &引用;mcar:违反合同;新方案需要一些答案:)

Graph &引用;mcar:违反合同;新方案需要一些答案:),graph,scheme,Graph,Scheme,我不熟悉这个计划,我有一些问题 首先我想做一个图,然后用它来做一些东西(比如Dijkstra等等),首先我想做一个函数,返回顶点的计数(不确定这是不是一个单词)。但我得到了这个错误,我只是不知道这是什么,为什么我得到它 另外,当我得到顶点的数量时,我想列出一个成对的列表,每一对都会给我一个给定顶点的信息,但我不知道怎么做 (例如,如果有4个顶点,则列表应为((0,-1)(0-1)(0-1)(0-1))“-1”将类似于无穷大,因为0下没有“权重”) 我确信有1182498种更好的方法来实现这个算法

我不熟悉这个计划,我有一些问题

首先我想做一个图,然后用它来做一些东西(比如Dijkstra等等),首先我想做一个函数,返回顶点的计数(不确定这是不是一个单词)。但我得到了这个错误,我只是不知道这是什么,为什么我得到它

另外,当我得到顶点的数量时,我想列出一个成对的列表,每一对都会给我一个给定顶点的信息,但我不知道怎么做

(例如,如果有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))))

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

此外,在
0
后面有一个右括号,这是错误的,这既与逻辑有关,也因为在方案中,
if
需要有一个else部分(可以在
时使用
,也可以在
时使用
,除非
以避免这种情况)

所以代码应该是

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

(display (getNumV G))
=> 6
此外,请尝试正确缩进代码,并且不要有悬空的右括号

为过程的list参数使用一个通用名称,例如
lst
,而不是真正的list
G
,会更简洁:

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

(display (getNumV G))
=> 6
请注意,您可以使用内置过程
length
而不是
getNumV

(display (length G))
=> 6

您可以保留名称
(define getNumV lenght)
而不只是使用
lenght
,非常感谢!真的很好的回答,我不知道长度是可用的。我可以用它来获取内部列表的编号吗?(我为我的英语感到抱歉,我的意思是如果我想知道(汽车G)的尺寸是否合适?@uselpa再次感谢你。你能帮我解决列表(0-1)(0-1)的第二个问题吗。。。我真的很抱歉,我知道这可能很简单,但是如果我列出((0-1)(0-1))并且现在我想更改第二个“-1”,我应该做类似(+1(cdr(cdr列表)))的事情,还是我必须做一些不同的事情?请将这作为一个单独的问题,以便您有足够的空间来准确描述您想要的内容。