Scheme中的函数,用于检查列表的长度是否为偶数

时间:2009-12-15 16:39:42

标签: scheme racket

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

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

是不是很正确?

3 个答案:

答案 0 :(得分:2)

您似乎将ifcond的语法混为一谈。我建议你参考language referenceif只有两个子句,并且你没有为else子句写else。 (提示:根本不需要if这个功能。)

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

哦,是的,并将length的调用重写为正确的前缀式Scheme函数调用。

答案 1 :(得分:2)

代码显然是错误的 - 您的%2假设为中缀符号,其中Scheme使用前缀表示法。您if的语法也是错误的 - 对于ifelse是隐式的(即您有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用相同的例子写了相同的函数...抱歉重复: - )