这是一个关于我上周测试的问题,我无法弄清楚如何做到这一点,而没有转换为十进制,这就是所要求的。
定义递归谓词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. `
答案 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))