在尝试为方案编写程序时需要帮助

时间:2013-10-10 02:13:37

标签: scheme procedure

我正在研究下面写下的一个棘手的问题,我需要一些帮助才能弄清楚如何解决这个问题:

假设您有一个Scheme函数,可以计算某个人选择的人数 公交车在给定的站点。公共汽车有许多站点,每个站点分配一个介于1和1之间的号码 100。 编写一个Scheme程序,它接收(i)一个函数f,它给出了 从每个公共汽车站接载的人数,以及(ii)整数m,并返回数字 公共汽车停靠的人数减少了很多人。 示例:假设公共汽车站提取功能如下:

(define (stops n)
    (cond ((= n 10) 20)
          ((= n 18) 18)
          ((= n 39) 52)
          ((= n 52) 12)
          ((= n 58) 23)
          ((= n 70) 34)
          ((= n 73) 18)
          ((= n 82) 11)
          ((= n 97) 33)
          (else 0)))

当程序应用于上面的停止程序并且给定m = 20时,它应该返回5 因为只有20个或更少的乘客被接走的唯一站点是站点10,18,52, 73和82。

我的第一个方法是编写辅助函数来添加参数n,虽然我不完全确定它会做什么(添加计数,可能?)。除此之外,我完全陷入困境。如果我能得到一些澄清。对此问题的指导或指导,我们将不胜感激。

4 个答案:

答案 0 :(得分:2)

我是名为let的粉丝,所以:

(define (how-many f m)
  (let loop ((i 1) (res 0))
    (if (<= i 100)
        (loop (+ i 1) (if (<= 1 (f i) m) (+ res 1) res))
        res)))

答案 1 :(得分:1)

这是一个仅限球拍的解决方案:

(define (count-fewer-or-equal f m)
  (count (lambda (i) (<= 1 (f i) m))
         (range 1 100)))

答案 2 :(得分:1)

您需要使用递归实现迭代。

这是伪代码:

(define (count f m)
  (define (count-iter i sum)
    (if (> i 100)
        sum
        (count-iter (+ i 1)
                    (if (include-stop? i)
                        (+ sum 1)
                        sum))))
  (count-iter 1 0))

答案 3 :(得分:0)

一旦解决,但远非唯一的

?b是我的谓词,表示返回0或1而不是#t或#f。

(define *potential-stops* (iota 100 1 1))

(define (stops-lt-m f m)
  (let ((lt-m?b (lambda (x) (if (> (f x) m) 0 1))))
    (reduce + 0 (map lt-m?b potential-stops)))) 

还可以使用带有lt-m的(长度(过滤器...))实现吗?

潜在停止因为它是一个常数,但如果停止编号系统发生变化则可能需要更改。