您好我已经编辑了方案中的函数代码,用于检查列表的长度是否均匀。
(define even-length?
(lambda (l)
(cond
((null? l)#f)
((equal? (remainder (length(l)) 2) 0) #t)
(else #f))))
是不是很正确?
答案 0 :(得分:2)
您似乎将if
和cond
的语法混为一谈。我建议你参考language reference。 if
只有两个子句,并且你没有为else子句写else
。 (提示:根本不需要if
这个功能。)
另外,如果列表为null
,请考虑返回null
是否有意义;可能您想要返回#t
或#f
。
哦,是的,并将length
的调用重写为正确的前缀式Scheme函数调用。
答案 1 :(得分:2)
代码显然是错误的 - 您的%2
假设为中缀符号,其中Scheme使用前缀表示法。您if
的语法也是错误的 - 对于if
,else
是隐式的(即您有if condition true-expression false-expression
。在这种情况下,您正在尝试从一条腿返回#t,从另一条腿返回#f - 这是非常不必要的。您只需返回在if
中测试的表达式。
编辑:另一个细节 - 您应该将其重命名为even-length?
。即使我假设它是一个谓词,even
之类的名称也意味着我(even 3)
应该返回#f
,而(even 4)
应该返回#t
- 但在这种情况下,根本不起作用。
Edit2:由于mquander已经为你提供了一个版本的代码,我想还有一个版本不会受到影响。我会这样写:
(define (even-length? L) (even? (length L)))
我不喜欢使用小写的'l'(但本身),所以我把它大写了。由于even?
是内置的,我使用它而不是找到余数。
运行它会产生:
> (even-length? `(1 2 3))
#f
> (even-length? `(1 2 3 4))
#t
>
这与您在一个方面的不同之处在于:空列表的长度为0,这被视为偶数,因此:
(偶数?`())
给#t。
答案 2 :(得分:1)
(define even-length? (lambda (l)
(even? (length l))))
用法:
(even-length? '(1 2 3 4))
#t
(even-length? '(1 2 3 ))
#f
正如其他人指出的那样,确实有一个谓词可以检查一个数字的均匀性,为什么不使用呢?
编辑:我刚刚看到Jerry Coffin用相同的例子写了相同的函数...抱歉重复: - )