Scheme 无法将if转换为cond
我试图理解为什么这两个函数给了我不同的结果。当我将嵌套的if语句转换为conds时,是否有丢失的情况?这些函数应该递归地对列表中的元素进行计数Scheme 无法将if转换为cond,scheme,Scheme,我试图理解为什么这两个函数给了我不同的结果。当我将嵌套的if语句转换为conds时,是否有丢失的情况?这些函数应该递归地对列表中的元素进行计数 (define (countall x L) (if (null? L) 0 (if (pair? L) (+ (countall x (car L)) (countall x (cdr L))) (if (eq? x L) 1 0) ) ) ) (countall 'a '(a (
(define (countall x L)
(if (null? L) 0
(if (pair? L) (+ (countall x (car L)) (countall x (cdr L)))
(if (eq? x L) 1 0)
)
)
)
(countall 'a '(a (a))) ;gives 2
(define (countall x L)
(cond
((null? L) 0)
((pair? L) (+ (countall x (car L)) (countall x (cdr L))))
(else (eq? x L) 1 0)
)
)
(countall 'a '(a (a))) ;gives 0?
我试着用手一步一步地通过,但我很难找到哪里出了问题。您的
else
案例包含三种不同的表达式:(eq?x L)
、1
和0
。这被视为begin
块(可以说cond
的每种情况都会自动启动begin
块),这意味着所有三个表达式都会按顺序求值,然后返回最后一个表达式的值。因此,无论x
是否等于L
,您的else
案例始终返回0
(eq?x L)
不应该是else
块中的表达式,它应该是条件之一。因此,它应该是:
(cond
((null? L) 0)
((pair? L) (+ (countall x (car L)) (countall x (cdr L))))
((eq? x L) 1)
(else 0))