【问题标题】:Scheme programming sum function overloading方案编程求和函数重载
【发布时间】:2012-03-04 08:43:19
【问题描述】:

定义一个函数sum,它接受两个数字或两个实函数,并返回它们的sum。例如

(sum 1 2) => 3
((sum cos exp) 0) => 2

我得到两个数字之和的代码如下:

(define sum (lambda (x y)
  (+ x y)))

但是这两个实际函数的代码是什么...?我该怎么做?有人可以帮忙吗?

还有我该怎么做:

定义一个函数sum-all,其工作方式类似于sum,但适用于数字列表或函数列表。假设列表至少包含一个元素。 例如

(sum-all (list 1 2 3)) => 6

((sum-all (list cos sin exp)) 0) => 2

注意:这不是家庭作业……我正在经历一个期中考试。

【问题讨论】:

  • 我试过的函数贴在上面:(define sum(lambda (x y) (+ x y)))
  • 对于((sum cos exp) 0) 工作sum 需要(lambda (f g) (lambda (v) (+ (f v) (g v)))) 将其与另一个求和函数(lambda (a b) (+ a b)) 结合起来,您需要查看参数的类型并决定什么与他们做。
  • (define sum (lambda (x y) (+ x y))) 几乎等同于 (define sum +)

标签: sum scheme overloading


【解决方案1】:

对于您问题的第一部分,我必须同意 PJ.Hades 的观点,即这是最简单的解决方案:

(define (sum x y)
  (if (and (number? x) (number? y))
      (+ x y)
      (lambda (n)
        (+ (x n) (y n)))))

对于第二部分,我们可以很好地利用高阶过程来编写一个简单的解决方案,该解决方案是前一个解决方案的推广:

(define (sum-all lst)
  (if (andmap number? lst)
      (apply + lst)
      (lambda (n)
        (apply + (map (lambda (f) (f n)) lst)))))

在这两个过程中,我假设所有操作数都属于同一类型:它们要么是全数字,要么是全函数,正如从问题中提供的示例代码中推断的那样。

【讨论】:

    【解决方案2】:

    你是这个意思吗?

    (define (sum a b)
        (if (and (number? a) (number? b))
            (+ a b)
            (lambda (x)
                (+ (a x) (b x)))))
    

    【讨论】:

      【解决方案3】:
      (define (sum lst)
      
             (cond 
      
               [(empty? lst) 0]
      
               [else (foldr + 0 lst)]))
      

      【讨论】:

        【解决方案4】:
        ((lambda (a b) (+ a b)) 4 5)
        

        这是如何使用lambda 完成的。

        使用define我们可以写成如下

        (define (sum a b) (+ a b))
        

        【讨论】:

        • 嗨,您可以随时编辑您的答案,将两个答案合并在一起,然后删除另一个。我已经为您编辑了它,并在此处包含了第二个答案。 :)
        【解决方案5】:

        我的方案有点生疏,所以也许有更好的方法来做到这一点,但你可以这样做:

        (define (sum-all lst)
          (define (sum-funcs-helper funcs x)
            (if (empty? funcs)
                0
                (+ ((car funcs) x)
                   (sum-funcs-helper (cdr funcs) x))))
          (if (empty? lst)
              0 ;; Beats me what this is supposed to return.
              (if (number? (car lst))
                  (apply + lst)
                  (lambda (x) (sum-funcs-helper lst x)))))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-06-19
          • 2014-12-15
          • 1970-01-01
          • 1970-01-01
          • 2019-04-09
          • 2012-10-13
          • 2023-04-08
          • 1970-01-01
          相关资源
          最近更新 更多