1

我正在处理一个困难的单词问题,写在下面,我需要一些帮助来试图弄清楚如何解决这个问题:

假设您有一个 Scheme 函数,它计算某辆公共汽车在给定站点接载的人数。公共汽车有许多站点,每个站点都分配了一个介于 1 和 100 之间的数字。编写一个 Scheme 过程,它接受 (i) 一个函数 f,它给出从每个公共汽车站接载的人数,以及 (ii) 一个整数 m,并返回公交车载 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,因为只有 10、18、52、73 和 82 停靠站只有 20 名或更少的乘客接载。

我的第一种方法是编写一个辅助函数来添加参数 n,尽管我不完全确定它会做什么(添加计数,也许?)。除此之外,我完全被卡住了。如果我可以澄清一下。指导或指导这个问题,将不胜感激。

4

4 回答 4

2

我是命名的粉丝,所以有:

(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)))
于 2013-10-10T17:42:06.733 回答
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))
于 2013-10-10T10:37:44.597 回答
1

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

(define (count-fewer-or-equal f m)
  (count (lambda (i) (<= 1 (f i) m))
         (range 1 100)))
于 2013-10-10T04:22:17.693 回答
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 的 (length (filter ...)) 实现吗?

可能的停靠站,因为它是一个常数,但如果停靠站编号系统发生更改,则可能需要更改。

于 2013-10-10T15:56:31.307 回答