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

#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))