我正在研究下面写下的一个棘手的问题,我需要一些帮助才能弄清楚如何解决这个问题:
假设您有一个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,虽然我不完全确定它会做什么(添加计数,可能?)。除此之外,我完全陷入困境。如果我能得到一些澄清。对此问题的指导或指导,我们将不胜感激。
答案 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的(长度(过滤器...))实现吗?
潜在停止因为它是一个常数,但如果停止编号系统发生变化则可能需要更改。