2012-03-04 42 views
3

定義一個函數求和,它取兩個數或兩個實函數並返回它們的和。例如。方案編程求和函數

(總和1 2)=> 3 ((總和COS EXP)0)=> 2

我得到的兩個數之和的代碼將是如下:

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

但是,兩個真實函數的代碼是什麼......? 我該怎麼做?任何人都可以請幫忙。

另外我該怎麼做...?

定義一個函數sum-all,其工作方式與sum相同,但是對數字列表或函數列表起作用。假設列表至少包含一個元素。例如。

(和 - 所有(列表1 2 3))=> 6

((和 - 所有(列表COS罪EXP))0)=> 2

注:這不是作業。 ..我正在經歷一個過去的中期。

+0

我與上述帳嘗試了功能: (限定總和(拉姆達(XY) (+ XY)))爲 – user1028 2012-03-04 08:51:34

+0

'((總和餘弦EXP)0)'工作'sum' (lambda(fg)(lambda(v)(+(fv)(gv))))'將其與另一個sum函數'(lambda(ab)(+ ab))'結合起來需要查看參數的類型並決定如何處理它們。 – 2012-03-04 09:00:26

+0

'(define sum(lambda(x y)(+ x y)))'幾乎等於'(define sum +)'。 – 2012-03-04 15:23:48

回答

0

我有點生疏我的計劃,所以也許有更好的方式來做到這一點,但你可以這樣做:

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

你的意思呢?

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

對於你的問題的第一部分,我會和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))))) 

在這兩個程序,我假設所有的操作數是相同類型的:他們要麼全數字要麼 全部功能,從問題中提供的示例代碼中推斷出來。

0
(define (sum lst) 

     (cond 

     [(empty? lst) 0] 

     [else (foldr + 0 lst)]))