Схема: использование процедуры в процедуре или как подсчитать количество вхождений каждого элемента - PullRequest
0 голосов
/ 18 октября 2018
(require (planet dyoo/simply-scheme:1:2/simply-scheme))

(define (ball-val value)
   (let ((color value))
       (cond ((equal? 'R color) 5)
             ((equal? 'W color) 2)
             ((equal? 'B color) 2)
             ((equal? 'G color) 1))))

(define (count-balls color bucket)
    (count (keep (lambda (c) (equal? color c)) bucket)))

Две процедуры дают значение каждого цветного шарика и подсчитывают количество шариков в ведре определенного цвета.

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

Напишите процедуру color-counts, которая принимает в качестве аргумента корзину и возвращает предложение, содержащее количество красных, количество зеленых, количество синих и количество белых в корзине..

ex:

  (color-counts '(R B G R R R B W R W))
    '(5 1 2 2)

  (color-counts '(W R R R R G B B G W))
    '(4 2 2 2)

Можно ли вызвать count-balls в color-count и просто вызвать count-balls для каждого цвета в color-count?или это невозможно?

Я пытался:

(define (color-counts bucket) 
  (count-balls 'R bucket count-balls 'W bucket count-balls 'B bucket count-balls 'G bucket)) 

Все, что я получаю:

#<procedure ...>

1 Ответ

0 голосов
/ 18 октября 2018

Вы можете вызывать любую понравившуюся процедуру из любой другой процедуры.

Вы неправильно набираете count-balls.Требуется только 2 аргумента, но вы вызываете его с 11 аргументами.Вам нужно написать отдельные вызовы для каждого цвета, а не помещать их все в один вызов.И вам нужно обернуть это при вызове list, чтобы создать список всех результатов.

(define (color-count bucket)
  (list (count-balls 'R bucket)
        (count-balls 'G bucket)
        (count-balls 'B bucket)
        (count-balls 'W bucket)))

Вы также можете использовать функцию map, чтобы удалить весь повторяющийся код:

(define (color-count bucket)
  (map (lambda (color) (count-balls color bucket))
       '(R G B W)))

map вызывает процедуру несколько раз с каждым элементом списка (R G B W) в качестве аргумента и возвращает список всех результатов.

...