0

嗨,我已经编辑了用于检查列表长度是否均匀的方案中的函数代码。

(define even-length?
  (lambda (l)
  (cond 
   ((null? l)#f)
   ((equal? (remainder (length(l)) 2) 0) #t)
   (else #f))))

正确吗?

4

3 回答 3

2

你似乎把所有的语法ifcond搞混了。我建议参考语言参考if只有两个子句,你不写elseelse 子句。(提示:你根本不需要iffor 这个函数。)

null另外,请考虑如果列表为null;是否有必要返回。可能您想返回#t#f代替。

哦,是的,并将您的调用重写length为适当的前缀样式的 Scheme 函数调用。

于 2009-12-15T16:48:06.157 回答
2

代码显然是错误的——您%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。

于 2009-12-15T16:55:37.837 回答
1
(define even-length? (lambda (l)
    (even? (length l))))

用法:

(even-length? '(1 2 3 4))
#t
(even-length? '(1 2 3 ))
#f

正如其他人指出的那样,确实有一个谓词来检查数字的偶数性,那么为什么不使用它呢?

编辑:我刚刚看到 Jerry Coffin 用同样的例子写了同样的函数……抱歉重复了 :-)

于 2009-12-16T23:15:14.097 回答