Схема программирования суммы функции перегрузки - PullRequest
3 голосов
/ 04 марта 2012

Определите функцию 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

Примечание: это не домашняя работа ... Я проходил среднесрочный период прошлого.

Ответы [ 5 ]

3 голосов
/ 04 марта 2012

Для первой части вашего вопроса, я должен согласиться с PJ. Хейдс, что это самое простое решение:

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

В обеих процедурах я предполагаю, что все операнды имеют одинаковый вид: они либо все числа, либо все функции, как следует из примера кода, приведенного в вопросе.

1 голос
/ 26 марта 2018
((lambda (a b) (+ a b)) 4 5)

так, как это делается с помощью lambda.

с использованием define, мы можем написать следующее

(define (sum a b) (+ a b))
1 голос
/ 08 апреля 2013
(define (sum lst)

       (cond 

         [(empty? lst) 0]

         [else (foldr + 0 lst)]))
1 голос
/ 04 марта 2012

Ты имеешь в виду это?

(define (sum a b)
    (if (and (number? a) (number? b))
        (+ a b)
        (lambda (x)
            (+ (a x) (b x)))))
0 голосов
/ 04 марта 2012

Я немного заржавел от своей Схемы, так что, возможно, есть лучший способ сделать это, но вы могли бы сделать:

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