#scheme #racket
#схема #racket
Вопрос:
Я новичок в схеме, и мне дали эту задачу в качестве домашнего задания. Я не знаю, как вести текущий подсчет в схеме, и с этой частью мне нужна помощь.
Вот проблема снова:
Функция 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’ (джон пол Джордж Ринго))
который должен возвращать 2.
Я достаточно долго смотрел на эту проблему, пожалуйста, объясните, как заставить счетчик работать.
Ответ №1:
Ты, мой друг, очень-очень близок к ответу на эту проблему. Чтобы завершить задачу, вам нужно написать тестовый пример. Причина, по которой вам нужно написать тестовый пример, заключается в том, что тогда вы сможете конкретно подумать о том, что означают фрагменты вашего кода. Наиболее конкретно, вам нужно подумать о том, что (count atm (cdr lst))
вычисляется для конкретного ввода, о котором вы думаете, а затем подумать о том, каков правильный ответ и как они связаны.
Комментарии:
1. Я не понимаю, как заставить его подсчитывать количество совпадений, которые он находит в списке. Я все еще застрял на этой проблеме.
2. Это заняло некоторое время, но я понял это, проблема была в том, что я не знал, что я мог сказать ( 1 (count atm (cdr lst))). На самом деле мы не изучали так много синтаксиса, это скорее своего рода исследование и самостоятельное изучение. Хотя спасибо за мысли.
3. Отлично! Если здесь есть урок, он может быть таким: основа функционального языка заключается в том, что выражение типа <code>( E E)</code> работает для любого выбора выражений E и E. Извиняюсь, если это уже было очевидно.
Ответ №2:
Давайте посмотрим на ваш код.
(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)))))
Если tail ( cdr
) of lst
содержит n
вхождения atm
, (count atm (cdr lst))
должна возвращать n
. Затем, зная, n
если (car lst)
это eq?
to atm
, сколько их в lst
?
Комментарии:
1. Я все еще не понимаю. Можете ли вы показать мне пример того, что вы имеете в виду?
2. @Ethan: Прочитайте последнее предложение. Если у вас есть
n
вхожденияatm
вcdr
и один вcar
, то сколько их всего?
Ответ №3:
(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))