Возникли проблемы при конвертации в cond - PullRequest
0 голосов
/ 09 сентября 2018

Я пытаюсь понять, почему эти две функции дают мне разные результаты. Есть ли какой-то случай, когда я пропускаю вложенные операторы 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 (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?

Я пытался пройти вручную, но мне трудно найти, что происходит не так.

1 Ответ

0 голосов
/ 09 сентября 2018

Ваш случай else содержит три различных выражения: (eq? x L), 1 и 0. Это рассматривается как блок begin (можно сказать, что каждый случай cond автоматически запускает блок begin), что означает, что все три выражения вычисляются по порядку, а затем возвращается значение последнего выражения. Таким образом, ваш else регистр всегда возвращает 0 независимо от того, равен x L или нет.

(eq? x L) не должно быть выражением в блоке else, это должно быть одно из условий вашего cond. Так и должно быть:

(cond
    ((null? L) 0)
    ((pair? L) (+ (countall x (car L)) (countall x (cdr L))))
    ((eq? x L) 1)
    (else 0))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...