Как посчитать количество нулей в списке? - PullRequest
0 голосов
/ 20 апреля 2011

Я новичок в Схеме, так может кто-нибудь дать мне пример?В Scheme нет локальной переменной, так как я могу отслеживать количество встречающихся нулей.

Я пытался

#lang scheme
(define zeroes
  (lambda (ll)
    (cond ((null? ll) 
           0)
          (else (= 0 (car ll))))
    (zeroes (cdr ll))
  )
)

Но компилятор жаловался:

cdr: expects argument of type <pair>; given ()

Спасибо,

Ответы [ 3 ]

3 голосов
/ 20 апреля 2011

Вот мое решение (поскольку ОП уже опубликовали свое):

(define (count-zeroes lst)
  (let loop ((lst lst)
             (count 0))
    (cond ((null? lst) count)
          ((zero? (car lst)) (loop (cdr lst) (+ count 1)))
          (else (loop (cdr lst) count)))))

Конечно, никакая обработка этого предмета не может считаться завершенной, если не говорить о fold, который обычно используется для «обобщения» списка до одного объекта (как мы делаем для этого вопроса): *

(define (count-zeroes lst)
  (fold (lambda (elem count)
          (if (zero? elem) (+ count 1) count))
        0 lst))
2 голосов
/ 20 апреля 2011

Только что разобрался с решением,

(define count
  (lambda (lst)
    (cond ((null? lst) 0)
          ((= 0 (car lst)) (+ 1 (count (cdr lst))))
          (else (+ 0 (count (cdr lst))))
    )      
  )
)
1 голос
/ 20 апреля 2011

Я пока держу это на уровне подсказки.

Ваша функция состоит в двух вещах.Сначала он вычисляет 0, если его аргумент является пустым списком, или #t или #f, если его аргумент является списком, который начинается с 0 или нет.Затем он выбрасывает этот результат и рекурсивно вызывает себя в остальной части списка.

Вам придется сделать две вещи, чтобы выполнить эту работу: 1) каким-то образом объединить результаты отдельных тестов с нулем (для мысленного эксперимента посмотрите на ваш код: как он будет возвращать значение 2, если в списке два ноля?);2) успешно завершить работу, когда он рекурсивно вызывает себя в пустом списке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...