方案:定义递归谓词u-even?获取一个列表,如果列表中的项目数是偶数,则返回#t

时间:2014-02-26 23:38:13

标签: list recursion scheme

这是一个关于我上周测试的问题,我无法弄清楚如何做到这一点,而没有转换为十进制,这就是所要求的。

定义递归谓词u-even?取一个列表ls表示一元中的非负整数,当且仅当数字是偶数时才返回#t。不要将列表转换为小数或使用十进制系统。回想一下ls可能包含的唯一符号是'l(单词“lion”的第一个字母)。

像这样工作:

     `~ (u-even? '(l l))
       #t
       ~ (u-even? '(l l l))
       #f
       ~ (u-even? '(l l l l))
       #t
       ~ (u-even? '(l l l l l l l))
       #f
       ~ (u-even? '())
       #t`

        `(define u-even?
          (lambda (ls)
            (cond
               [(null? ls) #t]
               [else ;;I JUST DON'T KNOW PLEASE GIVE ME A HINT AT LEAST. `

2 个答案:

答案 0 :(得分:2)

您熟悉even的定义吗?

(define (even x)
  (if (zero? x)
      #t
      (not (even (- x 1)))))

这是一个速度更快的版本,因为它不会在每次迭代中否定答案,并且会使这个尾部递归:

(define (even x)
  (cond ((zero? x) #t)
        ((= x 1) #f)
        (else (even (- x 2)))))

现在。将参数从数字更改为列表使您需要更改基本情况。例如。 (null? x)代替(zero? x),因为'()是偶数,就像0一样。

您能猜出如何在不使用length的情况下检查单个元素列表吗?

答案 1 :(得分:0)

如果我理解正确的问题,以下功能应该有效。

(define (u-even? l) 
  (define (helper in out) 
    (if (null? in) 
      out 
      (helper (cdr in) (not out)))) 
  (helper l #t))