(define mylist (list (list 'a (list 'b 'c)) (list 'b (list 'a 'd))
(list 'c (list 'a 'd)) (list 'd (list 'c 'b 'a))))
(define (total1 L)
(+ (length (cdr (car L))) (total1 (cdr L))))
我的目标是计算子列表的长度并将此值相加。
长度(('b'c)+('a'd)+('a'd)+('c'b'a))
所以我的函数应该返回9.但是当我调用这个函数时,我得到了这个错误:
汽车:合同违规 预期:对? 给出:()
我应该做什么?
答案 0 :(得分:0)
要解决此错误,您应该引入一项测试来检查您是否在列表的末尾。像这样:
(define (total L)
(if (null? L)
0 ;has to be 0 because it will be +'ed in the recursion
(+ (length (cdr (car L))) ;should be (car (cdr (car L))) or (cadar L)
(total (cdr L)))))
但是这段代码仍然给出了错误的结果,因为(cdr (car L))
返回第一个子列表的((b c))
,并且长度为1,因为它是一个包含1个元素的列表,列表为{{ 1}}。你想要的是(b c)