Функция count должна принимать два аргумента: атом и простой список. Функция должна возвращать количество раз, когда атом был найден в списке - PullRequest
3 голосов
/ 27 апреля 2011

Я новичок в схеме, и мне дали эту проблему в качестве домашней работы.Я не знаю, как сохранить подсчет числа оборотов в схеме, и в этой части мне нужна помощь.

Вот снова проблема:

Функция count должна принимать два аргумента: атом ипростой список.Функция должна возвращать количество раз, когда атом был найден в списке.

Вот что у меня есть:

(define (count atm lst)
    (cond
        ((null? lst) 0)
        ((eq? atm (car lst)) (i don't know how to make a count) (count atm (cdr lst)))
        (else (count atm (cdr lst)))))

Любая помощь будет очень признательна!

Я до сих пор не понимаю, что должно произойти, чтобы увеличить количество раз, когда атом находится в списке для каждой итерации функции.

Это тестовый пример, который мне дал мой учитель: (считать 'john' (john paul george ringo))

, который должен вернуть 2.

Я смотрелпожалуйста, объясните, как заставить работать счет.

Ответы [ 3 ]

1 голос
/ 27 апреля 2011

Вы, мой друг, очень и очень близки к решению этой проблемы.Чтобы закончить задачу, вам нужно написать контрольный пример.Причина, по которой вам нужно написать контрольный пример, заключается в том, что вы можете конкретно подумать о том, что означают фрагменты вашего кода.В частности, вам нужно подумать о том, что оценивает (count atm (cdr lst)) для конкретного ввода, о котором вы думаете, а затем подумать о том, каков правильный ответ и как они связаны.

0 голосов
/ 06 мая 2014
(define (count-atom atm list)
  (cond((null? list) 0)
       ((eq? atm (car list)) (+ 1 (count-atom atm (cdr list))))
       (else (count-atom atm (cdr list)))
       )
 )
(count-atom 'a '(a b a b a r a a a a a a a a a))
0 голосов
/ 27 апреля 2011

Давайте посмотрим на ваш код.

(define (count atm lst)
    (cond
        ;; This is obviously correct
        ((null? lst) 0)
        ;; See below
        ((eq? atm (car lst)) (somefunction (count atm (cdr lst))))
        ;; The next one's find as well
        (else (count atm (cdr lst)))))

Если хвост (cdr) lst содержит n вхождений atm, (count atm (cdr lst)) должен вернуть n. Затем, зная n, если (car lst) равно eq? до atm, сколько их в lst?

...