嗨,我已经编辑了用于检查列表长度是否均匀的方案中的函数代码。
(define even-length?
(lambda (l)
(cond
((null? l)#f)
((equal? (remainder (length(l)) 2) 0) #t)
(else #f))))
正确吗?
你似乎把所有的语法if
都cond
搞混了。我建议参考语言参考。 if
只有两个子句,你不写else
else 子句。(提示:你根本不需要if
for 这个函数。)
null
另外,请考虑如果列表为null
;是否有必要返回。可能您想返回#t
或#f
代替。
哦,是的,并将您的调用重写length
为适当的前缀样式的 Scheme 函数调用。
代码显然是错误的——您%2
假设的中缀表示法,其中 Scheme 使用前缀表示法。你的语法if
也是错误的——对于 an if
, the是隐含的else
(即你有if condition true-expression false-expression
只需返回您在if
.
编辑:另一个细节——你真的应该把它重命名为even-length?
. 即使我假设它是一个谓词,一个名字 likeeven
也会暗示我(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。
(define even-length? (lambda (l)
(even? (length l))))
用法:
(even-length? '(1 2 3 4))
#t
(even-length? '(1 2 3 ))
#f
正如其他人指出的那样,确实有一个谓词来检查数字的偶数性,那么为什么不使用它呢?
编辑:我刚刚看到 Jerry Coffin 用同样的例子写了同样的函数……抱歉重复了 :-)