【问题标题】:Need help in trying to write a procedure for this in scheme在尝试为此方案编写程序时需要帮助
【发布时间】:2013-10-17 15:09:39
【问题描述】:

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

假设你有一个 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、10、18、52、 73 和 82。

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

【问题讨论】:

  • 您需要编写一个函数,该函数将一个过程f 和一个数字m 作为参数。你需要用从1100的每个数字i调用f,并计算(f i)小于或等于m的次数。
  • 您能再解释一下吗?我仍然无法理解这一切的逻辑

标签: scheme procedure


【解决方案1】:

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

(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)))

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      你需要使用递归来实现迭代。

      这是伪代码:

      (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))
      

      【讨论】:

      • 仅供参考:习惯上写成(let count-iter ((i 1) (sum 0)) ...)
      【解决方案4】:

      一次解决,但远非唯一

      ?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 ...)) 实现吗?

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-25
        • 2019-09-15
        相关资源
        最近更新 更多