方案:在过程中使用过程或如何计算每个元素的出现次数

时间:2018-10-17 23:24:32

标签: scheme procedure

(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,该过程以存储桶作为参数,并返回一个句子,其中包含存储桶中红色的数量,绿色的数量,蓝色的数量和白色的数量。

     

例如:

  (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 :(得分:0)

您可以从任何其他过程中调用任何您喜欢的过程。

您打错了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)的每个元素为参数重复调用该过程,并返回所有结果的列表。